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

How to add a Class file to an aspx file and invoke methods from class file into aspx while controls like GridView are in aspx file?

提问人:darieem 提问时间:4/14/2023 最后编辑:Benjamin Buchdarieem 更新时间:4/18/2023 访问量:70

问:

我正在使用 ASP.NET Web 窗体。我正在尝试从单独的 cs 类文件中调用方法。具体来说,我有一个aspx文件和一个类文件:Default.aspxClass1.cs

这是我的文件: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"
    }
  }
}

下面是 GridView1 标记:Default.aspx

<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 类继承自“默认”页,以便在 SU 类中继承 GridView1 控件。

问题是,当我在 Default.aspx 中调用 SU 类时,我收到一条错误消息:在以下代码行:在 SU 类中。object reference not set to an instance of an objectfor (int i = 0; i < GridView1.Rows.Count; i++)

有人可以帮我找出错误的原因是什么吗?

C# asp.net ASP.NET-MVC-3 Web 窗体

评论

0赞 jdweng 4/14/2023
您需要该类的实例。在包含 gridview1 的类中,需要将实例传递给新代码。
0赞 darieem 4/14/2023
这对我不起作用
0赞 jdweng 4/14/2023
您需要一个对实例使用 'new' 的构造函数。请参阅以下内容:learn.microsoft.com/en-us/dotnet/api/...
0赞 Albert D. Kallal 4/18/2023
请看下面的例子。我有一个类,我针对网格视图调用该类的 MyLoop 方法。

答:

0赞 Albert D. Kallal 4/15/2023 #1

如前所述,您确实不希望该类从当前页面继承,因为每个aspx页面都创建了硬代码和生成的页面类。如果从一个页面继承,则类的方法和功能将仅限于一个页面!!

但是,如前所述,在注释中,将 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();     // invoke MyLoop method of class
        }
    }

因此,我们创建了类 “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。如果您只有,并且始终有一个例程来针对网格视图运行?(那个循环)?

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

在这种情况下,您只需要一个要调用的函数,而无需创建对象。因此,您需要一些“辅助”代码位。因此,您将并且应该创建一个静态类 - 并将 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 中。

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

enter image description here

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