在asp:GridView中单击“编辑”时会创建重复列

时间:2015-04-16 17:31:08

标签: asp.net 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();
    }

输出:这很好

enter image description here

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

enter image description here

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

您没有在数据绑定代码中检查IsPostBack。因此,每次您向页面发布一次又一次执行代码时。所以每次你都会添加更多列。

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

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());

}

答案 1 :(得分:0)

尝试:

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();
}