如何添加一个类文件到一个aspx文件,并调用类文件到aspx的方法,而像GridView控件在aspx文件?

u3r8eeie  于 2023-04-22  发布在  .NET
关注(0)|答案(1)|浏览(133)

我正在使用ASP.NET Web窗体。我试图从单独的cs类文件调用方法。具体来说,我有一个aspx文件Default.aspx和一个类文件Class1.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"
    }
  }
}

下面是从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页面继承,以便在SU类中继承GridView1控件。
问题是,当我调用Default.aspx中的SU类时,我得到一条错误消息:object reference not set to an instance of an object在这行代码中:SU类中的for (int i = 0; i < GridView1.Rows.Count; i++)
有人能帮我找出错误的原因吗?

sqserrrh

sqserrrh1#

好吧,正如前面提到的,你真的不希望那个类继承自当前页面,因为每个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";
            }
        }
    }
}

现在,我认为上面的例子对于一个类来说是一个“不太理想”的例子,但它仍然给出了这里的想法。
将对象(gridview)作为新构造函数的一部分传递,然后该类的任何方法都可以用于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进行操作。请注意,该示例是一个静态类-不需要这样的“助手”代码是非静态类。

相关问题