C# DropDownList事件后,GridView中的列将重复

C# DropDownList事件后,GridView中的列将重复,c#,asp.net,gridview,autopostback,C#,Asp.net,Gridview,Autopostback,我想学习一些关于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.Colu

我想学习一些关于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();
}
受保护的无效页面加载(对象发送方,事件参数e)
{
DataTable=新的DataTable();
grid1=新的GridView();
this.form1.Controls.Add(grid1);
grid1.AutoGenerateColumns=false;
表.列.添加(“剂量”,类型(int));
表.列.添加(“药物”,类型(字符串));
表.列.添加(“患者”,类型(字符串));
表.列.添加(“日期”,类型(日期时间));
//这里我们添加五个数据行。
表.Rows.Add(25,“Indocin”,“David”,DateTime.Now);
添加(50,“Enebrel”,“Sam”,DateTime.Now);
表.Rows.Add(10,“Hydrazine”,“Christoff”,DateTime.Now);
添加(21,“Combivent”,“Janet”,DateTime.Now);
表.行.添加(100,“迪兰丁”,“梅勒妮”,日期时间.现在);
for(int i=0;i
结果:

但如果我从标签旁边的DropDownList中更改所选值,则会产生以下结果:

为什么专栏越来越多?有什么想法吗

编辑:
我并没有写我想把数据库中的数据放到GridView中。我将有一个SQL查询,例如“SELECT*FROM TableName WHERE id=“+DropDownList1.SelectedItem”,因此我认为它必须在每次回发时执行。

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


你最好去微软虚拟学院看看。

把你的页面加载事件代码放进去

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

每次任何控件引发回发时,它都会触发页面加载事件,从而使应用程序向响应中添加新的gridview。了解回发的工作原理和页面生命周期

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

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

if (!IsPostBack)
            {
                do something
                return;
            }

正如其他人所说——如果你在第一次加载和每次回发时都这样做,你会得到重复的。form1中的控件存储在视图状态,但每次都会创建新控件。将代码封装在

if (!IsPostBack)
{
     your code here
}

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