简体   繁体   English

当用户刷新页面时,为什么GridView列名重复出现?

[英]Why GridView column names are repeating when user refresh the page?

I have a GridView, I got an output what I expect. 我有一个GridView,我得到了期望的输出。 But when I click the refresh button without any change, it's repeating the same column names. 但是,当我单击刷新按钮而不进行任何更改时,它将重复相同的列名。 How to prevent to repeating the columns?. 如何防止重复列?

This is my output one which is correct. 这是我的输出是正确的。 I will get the output when I click the refresh button Output one What i Expect 我会得到的输出,当我点击刷新按钮, 输出一个我期待什么

When I click refresh button again it will repeat the same coumns names in the same gridview. 当我再次单击刷新按钮时,它将在同一gridview中重复相同的列名称。 Output two which is wrong . 输出两个错误

I want to know why its repeating and how to prevent it. 我想知道为什么它会重复以及如何防止它。

this is my code 这是我的代码

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

C# code: 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]);
            }
}

I have not added any cookies my page. 我的页面没有添加任何cookie。 But When I try after deleting cookies from browser, I got it output without repeating columns 但是当我尝试从浏览器中删除Cookie后,我得到了它的输出而无需重复列

Consider implementing a call to dt.Columns.Clear(); 考虑实现对dt.Columns.Clear();的调用dt.Columns.Clear(); . It's in my experience that when updating a UI it's usually best to clear it and redraw. 以我的经验,在更新UI时,通常最好将其清除并重绘。

This happens due to postback . 发生这种情况是由于回发。 Write in the top of your code this if statement and place all of your code here : 在此代码的顶部编写此if statement ,并将所有代码放在此处:

if (!ispostback)
{

....

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM