【问题标题】:Columns in GridView are duplicating after DropDownList EventGridView 中的列在 DropDownList 事件之后重复
【发布时间】:2015-10-22 23:51:03
【问题描述】:

我想了解一些有关 DataTable 和 GridView 的知识。我在网上找到了一段代码:

protected void Page_Load(object sender, EventArgs e)
{
   DataTable table = new DataTable();
   grid1 = new GridView();
   this.form1.Controls.Add(grid1);

   grid1.AutoGenerateColumns = false;

   table.Columns.Add("Dosage", typeof(int));
   table.Columns.Add("Drug", typeof(string));
   table.Columns.Add("Patient", typeof(string));
   table.Columns.Add("Date", typeof(DateTime));

   // Here we add five DataRows.
   table.Rows.Add(25, "Indocin", "David", DateTime.Now);
   table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
   table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
   table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
   table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);

   for (int i = 0; i < table.Columns.Count; i++)
            {
              BoundField boundfield = new BoundField();
              boundfield.DataField = table.Columns[i].ColumnName.ToString();
              boundfield.HeaderText = table.Columns[i].ColumnName.ToString();
              grid1.Columns.Add(boundfield);
            }
   grid1.DataSource = table;
   grid1.DataBind();
}

结果:enter image description here

但是如果我从标签旁边的下拉列表中更改选择值,结果是:enter image description here

为什么列越来越多?有什么想法吗?

编辑: 我没有写我想将数据库中的数据放入 GridView。我将有一个 SQL 查询,例如"SELECT * FROM TableName WHERE id = " + DropDownList1.SelectedItem,所以我认为它必须与每个 Postback 一起执行。

【问题讨论】:

    标签: c# asp.net gridview autopostback


    【解决方案1】:

    这是因为您在每次回发时都执行代码,请评估 Page.IsPostBack 属性以检查它是初始页面加载还是回发。

    你最好去微软虚拟学院呆一会儿。

    【讨论】:

    • 哦,我没写我想把数据库中的数据放到GridView中。我将有一个 SQL 查询,例如"SELECT * FROM TableName WHERE" + DropDownList1.SelectedItem,所以我认为它必须在每次回发时执行。
    • 在 DropDownList 的 SelectedIndexChanged 事件上执行此操作,但这并不意味着您应该一遍又一遍地创建列。让一个名为“BuildGridView”的方法在 Page_Load (IsPostback == true) 上调用一次,并让另一个名为“PopulateGridView”的方法在 SelectedIndexChanged 事件上调用它。
    【解决方案2】:

    把你的页面加载事件代码放在里面

    if(!Page.IsPostBack)
    {
            // Your logic here
    }
    

    每当任何控件导致回发时,它都会触发页面加载事件,这会导致您的应用程序添加新的 gridview 来响应。了解回发的工作原理和页面生命周期。

    【讨论】:

      【解决方案3】:

      您可以先清除网格,然后将数据加载到其中。

      不过,回发是一个更好的选择。代码是:

      if (!IsPostBack)
                  {
                      do something
                      return;
                  }
      

      【讨论】:

        【解决方案4】:

        其他人所说的 - 如果您在第一次加载时执行此操作,并且每次回发,您都会得到重复。 form1 中的控件存储在视图状态中,但您每次都在创建新控件。将代码封装在

        if (!IsPostBack)
        {
             your code here
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 2010-11-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多