在 asp:GridView 中单击 "Edit" 时会创建重复的列

Duplicate columns get created while clicking "Edit" in asp:GridView

我有 asp:GridView 我正在使用 AutoGenerateEditButton="True" 属性 来编辑网格行。现在的问题是每当我单击 Edit 按钮时,列就会再次填充。例如,如果有 4 列,如果我单击 Edit,则相同的 4 列将重新出现。

.ASPX代码:

<asp:GridView ID="grdEmpDetail" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" 
            OnRowEditing="grdEmpDetail_RowEditing"
            OnRowCancelingEdit="grdEmpDetail_RowCancelingEdit"
            OnRowUpdated="grdEmpDetail_RowUpdated" 
            AutoGenerateEditButton="True">
</asp:GridView>

代码隐藏:在网格上动态绑定数据

protected void Page_Load(object sender, EventArgs e)
{
    WorkSampleBusiness.BusinessObject objBL = new WorkSampleBusiness.BusinessObject();
    this.grdEmpDetail.AutoGenerateColumns = false;
    try
    {
        DataTable dt = new DataTable();
        dt = objBL.OrderDetail();
        foreach (var col in dt.Columns)
        {
            if (col.ToString() == "ID" || col.ToString() == "First Name" || col.ToString() == "Last Name" || col.ToString() == "Business Phone" || col.ToString() == "Job Title")
            {
                BoundField objBoundField = new BoundField();
                objBoundField.DataField = col.ToString();
                objBoundField.HeaderText = col.ToString();
                this.grdEmpDetail.Columns.Add(objBoundField);
            }
        }
        this.grdEmpDetail.DataSource = dt;
        this.grdEmpDetail.DataBind();
    }
    catch
    {
        throw;
    }
}

处理编辑模式:

protected void grdEmpDetail_RowEditing(object sender, GridViewEditEventArgs e)
    {
        this.grdEmpDetail.EditIndex = e.NewEditIndex;
        this.grdEmpDetail.DataBind();
    }

protected void grdEmpDetail_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        this.grdEmpDetail.EditIndex = -1;
        this.grdEmpDetail.DataBind();
    }

输出:很好

问题:这是我遇到问题的地方。

我在这里错过了什么?

您没有在数据绑定代码中检查 IsPostBack。结果,每次您 post 到该代码被一次又一次执行的页面。所以每次你都会添加更多的列。

像这样修改你的处理程序:

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack) {
       // All of your existing code goes here
    }
}

编辑

比那要复杂一点。单击编辑时,您确实需要将 DataGrid 重新绑定到数据源,但您只是不想再次添加列。这需要您对代码进行一些分解,以便可以重新使用数据绑定代码,而无需绑定到列添加。

首先,让我们创建一个专门用于添加出现在输入中的列的方法 DataTable:

private void AddColumnsToDataGrid(DataTable dt) {

    foreach (var col in dt.Columns) {
        if (col.ToString() == "ID" 
            || col.ToString() == "First Name" 
            || col.ToString() == "Last Name" 
            || col.ToString() == "Business Phone" 
            || col.ToString() == "Job Title")
        {
            BoundField objBoundField = new BoundField();
            objBoundField.DataField = col.ToString();
            objBoundField.HeaderText = col.ToString();
            this.grdEmpDetail.Columns.Add(objBoundField);
        }
    }

}

接下来创建一个将 DataTable 数据绑定到您的网格的方法:

private void DataBindGrid(DataTable dt) {

    this.grdEmpDetail.DataSource = dt;
    this.grdEmpDetail.DataBind();

}

现在您已经提取了部分代码,您可以在适当的地方重新使用这些方法,并且只添加一次列:

页面加载处理程序

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack) {

        WorkSampleBusiness.BusinessObject objBL = new WorkSampleBusiness.BusinessObject();
        this.grdEmpDetail.AutoGenerateColumns = false;

        try {
            DataTable dt = objBL.OrderDetail();
            AddColumnsToDataGrid(dt);
            DataBindGrid(dt);
        } catch {
            // Side Note:  If you're just re-throwing the exception
            // then the try/catch block is completely useless.
            throw;
        }

    }

}

编辑处理程序

protected void grdEmpDetail_RowEditing(object sender, GridViewEditEventArgs e)
{

    this.grdEmpDetail.EditIndex = e.NewEditIndex;

    WorkSampleBusiness.BusinessObject objBL = new WorkSampleBusiness.BusinessObject();    
    DataBindGrid(objBL.OrderDetail());

}

protected void grdEmpDetail_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    this.grdEmpDetail.EditIndex = -1;

    WorkSampleBusiness.BusinessObject objBL = new WorkSampleBusiness.BusinessObject();    
    DataBindGrid(objBL.OrderDetail());

}

尝试:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        Fill_Grid();
    }
}
protected Void Fill_Grid()
{

    if (grdEmpDetail.Columns.Count > 0)
    {
        for (int n = 0; n < grdEmpDetail.Columns.Count; n++)
        {
            grdEmpDetail.Columns.RemoveAt(n);

        }
     grdEmpDetail.DataBind();
    }
    this.grdEmpDetail.AutoGenerateColumns = false;
    WorkSampleBusiness.BusinessObject objBL = new WorkSampleBusiness.BusinessObject();
    try
    {
        DataTable dt = new DataTable();
        dt = objBL.OrderDetail();
        foreach (var col in dt.Columns)
        {
            if (col.ToString() == "ID" || col.ToString() == "First Name" || col.ToString() == "Last Name" || col.ToString() == "Business Phone" || col.ToString() == "Job Title")
            {
                BoundField objBoundField = new BoundField();
                objBoundField.DataField = col.ToString();
                objBoundField.HeaderText = col.ToString();
                this.grdEmpDetail.Columns.Add(objBoundField);
            }
        }
        this.grdEmpDetail.DataSource = dt;
        this.grdEmpDetail.DataBind();
    }
    catch (exception e1)
    {
    }
}
protected void grdEmpDetail_RowEditing(object sender, GridViewEditEventArgs e)
{
    this.grdEmpDetail.EditIndex = e.NewEditIndex;
    Fill_Grid();
}

protected void grdEmpDetail_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    this.grdEmpDetail.EditIndex = -1;
    Fill_Grid();
}