【问题标题】:Why GridView column names are repeating when user refresh the page?为什么当用户刷新页面时 GridView 列名重复?
【发布时间】:2016-12-02 13:44:01
【问题描述】:

我有一个 GridView,我得到了我期望的输出。但是当我点击刷新按钮而不做任何更改时,它会重复相同的列名。如何防止重复列?。

这是我的输出,它是正确的。单击刷新按钮时,我将获得输出 Output one What i Expect

当我再次单击刷新按钮时,它将在同一个网格视图中重复相同的名称。 Output two which is wrong.

我想知道它为什么会重复以及如何防止它。

这是我的代码

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound"></asp:GridView>

C#代码:

string selectedColumn;
    string[] splitSelectedColumn;

    string groupByColumn;
    string[] splitGroupByColumn;
    protected void btnRefresh_Click(object sender, EventArgs e)
    {
        selectedColumn = txtColumnNames.Text;
        splitSelectedColumn = selectedColumn.Split(',');

        groupByColumn = txtGroupBy.Text;
        splitGroupByColumn = groupByColumn.Split(',');

        Response.Write("group length="+splitGroupByColumn.Length);

        string[] compareGroup = new string[splitGroupByColumn.Length];
        Response.Write("inside array=" + compareGroup[0]);

        //Grouping column names using selected column text
        int flag = 1;
        foreach (string columnName in splitSelectedColumn)
        {
            flag = 1;
            foreach (string groupByName in splitGroupByColumn)
            {
                if (columnName.Equals(groupByName))
                {
                    flag = 2;
                    break;
                }
            }
            if (flag == 1)
            {
                groupByColumn = groupByColumn + "," + columnName;
            }

        }

        // CREATE A TEMPLATE FIELD AND BOUND FIELD

        BoundField bfield = new BoundField();

        TemplateField[] ttfield = new TemplateField[10];
        for (int i = 0; i < splitSelectedColumn.Length; i++)
        {
            if (i < splitGroupByColumn.Length)
            {
                ttfield[i] = new TemplateField();
                ttfield[i].HeaderText = splitGroupByColumn[i];
                GridView1.Columns.Add(ttfield[i]);
            }
            else
            {
                try
                {
                    bfield.HeaderText = splitSelectedColumn[i];
                    bfield.DataField = splitSelectedColumn[i];
                    Response.Write("<br/>BOUND FIELD==" + splitGroupByColumn[i]);
                    GridView1.Columns.Add(bfield);
                }
                catch (Exception)
                {

                }

            }
        }

        // CREATE DATA TABLE and COLUMN NAMES
        DataTable dt = new DataTable();
        for(int i=0;i<splitSelectedColumn.Length;i++)
        {
            dt.Columns.Add(splitSelectedColumn[i]);
            //Console.WriteLine(splitSelectedColumn[i]);
            System.Diagnostics.Debug.WriteLine(splitSelectedColumn[i]);
            Response.Write("<br/>DT COLUMN NAMES==" + splitSelectedColumn[i]);
        }

        //ADD ROWS FROM DATABASE
        string cs = ConfigurationManager.ConnectionStrings["connectionStringDB"].ConnectionString;

        int compareFlag = 0;
        using (SqlConnection con = new SqlConnection(cs))
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            //cmd.CommandText = "select " + selectedColumn + " FROM [RMSDemo].[dbo].[ItemRelation] where ItemLookupCode='" + txtItemLookupCode.Text + "'and ChildItemLookupCode1='" + txtChildItemLookupCode.Text + "' group by " + groupByColumn + " ";
            cmd.CommandText = "select " + selectedColumn + " FROM [RMSDemo].[dbo].[ItemRelation] group by " + groupByColumn + " ";
            con.Open();
            SqlDataReader rd = cmd.ExecuteReader();

            string addData=string.Empty;
            while (rd.Read())
            {
                if (compareFlag == 0)
                {
                    for (int i = 0; i < splitGroupByColumn.Length; i++)
                    {
                        compareGroup[i] = rd[splitGroupByColumn[i]].ToString();
                        Response.Write("<br/>COMPARE GROUP [i]==" + compareGroup[i]);
                    }

                    compareFlag = 1;
                    //string[] stack = Enumerable.Range(0, splitSelectedColumn.Length)
                    //    .Select(i => string.Empty)
                    //    .ToArray();

                    string[] stackss = new string[splitSelectedColumn.Length];
                    Response.Write("<br/>splitSelectedColumn.LENGTH==" + splitSelectedColumn.Length);
                    Response.Write("<br/>STACK.LENGTH=="+stackss.Length);
                    for (int i = 0; i < stackss.Length; i++)
                    {
                        stackss[i] = "";
                    }

                    for (int i = 0; i < compareGroup.Length;i++ )
                    {
                        stackss[i] = compareGroup[i];
                    }

                    //tESTING PURPOSE ONLY
                    for (int i = 0; i < stackss.Length; i++)
                    {
                        //stack[i] = "";
                        Response.Write("<br/>STACK.VALUES==" + stackss[i]);
                    }

                    var row = dt.NewRow();

                    DataRowCollection drc = dt.Rows;
                    DataRow rowss = drc.Add(stackss);
                    //dt.Rows.Add(rowss);

                }

                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
            rd.Close();
        }            
    }
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            int size = splitGroupByColumn.Length;
            Button[] lnkBtn = new Button[size];
            for (int i = 0; i < splitGroupByColumn.Length; i++)
            {
                lnkBtn[i] = new Button();
                lnkBtn[i].ID = "lnkView";
                lnkBtn[i].Text = (e.Row.DataItem as DataRowView).Row[splitGroupByColumn[i]].ToString();
                //Response.Write("<br/>PRINT==" + lnkBtn[i].Text);
                //lnkView.Text = (e.Row.DataItem as DataRowView).Row["Id"].ToString();
                //lnkView.Click += ViewDetails;
                lnkBtn[i].CommandArgument = (e.Row.DataItem as DataRowView).Row[splitGroupByColumn[i]].ToString();
                e.Row.Cells[i].Controls.Add(lnkBtn[i]);
            }
}

我没有在我的页面上添加任何 cookie。但是当我从浏览器中删除 cookie 后尝试时,我得到了输出而不重复列

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    考虑实现对dt.Columns.Clear(); 的调用。根据我的经验,在更新 UI 时,通常最好将其清除并重绘。

    【讨论】:

      【解决方案2】:

      这是由于回发而发生的。在代码顶部写下 if statement 并将所有代码放在这里:

      if (!ispostback)
      {
      
      ....
      
      }
      

      【讨论】:

      • 我觉得你理解错了。起初 Gridview 不会出现。当我单击刷新按钮时,它将显示我在第一张图片上所期望的输出。然后当我再次单击刷新时它正在重复列。正如你所说,如果我使用if(!ispostback),它就不会这样
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-21
      相关资源
      最近更新 更多