如何将类文件添加到 aspx 文件并将类文件中的方法调用到 aspx 中,而 GridView 等控件在 aspx 文件中?

问题描述 投票:0回答:1

我正在使用 Webforms asp.net;我试图从一个单独的 cs 类文件中调用一个方法。具体来说,我有一个 aspx 文件 Default.aspx 和一个类文件 Class1.cs:

这是我的 aspx 文件:Default.aspx

 `public partial class Default : Page

 {
      for (int i = 0; i < GridView1.Rows.Count; i++)

            {

                If (TextBox1.Text == Label1.Text)  { Convert.ToDouble(GridView1.Rows[i].Cells[0].Text += 1} 


            }

            else  {Convert.ToDouble(GridView1.Rows[i].Cells[0].Text += 0}


    /////////////invoke SU//////////

     Class1  u = new Class1();
         u.SU();

 }`

这是我的课程文件:Class1.cs

` public partial class SU : Default

 {
    
     for (int i = 0; i < GridView1.Rows.Count; i++)

            {

                If ( Convert.ToDouble(GridView1.Rows[i].Cells[0].Text != 1) {Convert.ToString(GridView1.Rows[i].Cells[1].Text == "empty"} 


            }

 }
`

这里是来自 Default.aspx 的 GridView1 标记

<asp:GridView ID="GridView1" runat="server" Width ="219px" Height="258px">
                    <Columns>
                        <asp:BoundField AccessibleHeaderText="s1" HeaderText="k1" />
                        <asp:BoundField AccessibleHeaderText="s2" HeaderText="k2" />

 </Columns>
                </asp:GridView>

我让 SU 类继承自 Default page 以在 SU 类中继承 GridView1 控件

问题是当我在 Defult.aspx 中调用 SU 类时,我在这行代码中收到错误消息:“对象引用未设置到对象的实例”:“ for (int i = 0; i < GridView1.Rows.Count; i++)" in SU class

c# asp.net asp.net-mvc-3 webforms
1个回答
0
投票

好吧,如前所述,您真的不希望该类从当前页面继承,因为每个 aspx 页面都有一个硬代码和已创建的生成页面类。如果你继承自ONE page,那么你的类的方法和能力将被限制在一页!!!

但是,如评论中所述,将 gridview 作为构造函数传递给您的类的建议是这里的道路和解决方案。

所以,假设我们的页面上有这段代码。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string strSQL =
                @"SELECT ID, FirstName, LastName, City, HotelName, Description,
                  ORDER BY HotelName";

            GridView1.DataSource = General.MyRst(strSQL);
            GridView1.DataBind();

            SU MySU = new SU(GridView1);
            MySU.MyLoop();
        }
    }

所以,我们创建了我们类“su”的实例。

所以,该课程将在 su.cs.

因此:

public class SU
{
    private GridView GV;

    public SU (GridView GV)
    {
        this.GV = GV;
    }

    public void MyLoop()
    {
        for (int i = 0; i < GV.Rows.Count; i++)
        {

            if (Convert.ToDouble(GV.Rows[i].Cells[0].Text) != 1) 
            {
                GV.Rows[i].Cells[1].Text = "empty";
            }
        }
    }
}

现在,我认为上面是一个“不太”那么理想的类示例,但它仍然在这里给出了想法。

将对象(网格视图)作为新构造函数的一部分传递,然后该类的任何方法都可以用于 gv。如果您只有并且总是有一个例程来针对 gridview 运行? (那个循环)?

那么这并不意味着任何优势,在这种情况下也不需要上课。

在那种情况下,你只需要一个函数来调用,而不需要创建一个对象。因此,您需要一些“帮助”代码。因此,你会而且应该只创建一个静态类 - 并将 gv 传递给该函数,而不需要“创建”类的实例在这里是必要的。

但是,我确实理解你的问题只是这里的概念证明。所以,虽然这个特定的例子是“蹩脚的”,并且 Gridview 第一列的一些硬编码代码不保证一个类,但我假设一个静态类/函数,如果你需要在你的应用程序中说十几个地方的代码,那么可以肯定的是,这可以/将证明创建一个类是合理的——但在这种情况下,静态类可能会更好。

在几乎所有情况下,从当前页面传递对象是最有意义的,因为每个网页实际上都是自己定义的类,并且尝试继承将意味着您创建的类将与问题,因此生成的类对任何其他网页都没有用。

此外,请记住,您可以将“页面”传递给那些例程。

例如,我厌倦了一遍又一遍地键入代码以在页面上加载控件。

所以,我想,为什么不拿一个数据表和 div 并将其传递给为我填写控件的通用代码例程。

所以,现在我这样做:

    string strSQL = $"SELECT * FROM tblHotelsA WHERE ID = {PKID}";
    DataRow rstData = General.MyRst(strSQL).Rows[0];
    General.FLoader(this.EditRecord, rstData);

注意 General 是一个静态类。

我有一个返回数据表的例程,

一个名为 FLoader 的例程被传递给一个“div”(在此示例中称为 EditReocrd)。

该代码的作用是为我自动填写我放入页面上那个 div 的控件。

所以,上面的内容自动为我填写了数据表中的控件,因此我会这样说:

所以我可以对任何页面使用通用的 Floader 例程,因为我只是将控件(在本例中为 div)传递给该例程,(并且我将数据表传递给它 - 只有一行)。因此,它针对该页面的 div 进行操作。请注意,示例是一个静态类——不需要这样的“帮助”代码是一个非静态类。

© www.soinside.com 2019 - 2024. All rights reserved.