2015-04-16 22 views
0

我有asp:GridView,我使用AutoGenerateEditButton="True"屬性編輯網格行。現在的問題是,每當我點擊Edit按鈕,列再次填充。例如,如果有4列,如果我點擊Edit比相同的4列將重新出現。在asp中單擊「編輯」時會創建重複列:GridView

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

OUTPUT:這是細

enter image description here

問題:這是我得到問題的地方。

enter image description here

缺少什麼我在這裏?

+0

您可以張貼整個'Page_Load'處理?你在你的數據綁定代碼中檢查「IsPostBack」嗎? – mclark1129

+0

@MikeC我更新了它。我不檢查'IsPostBack'。 – CSharper

回答

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

} 
+0

在這種情況下,即使我綁定了網格,網格變空了(在'_RowEditing'方法中)。我在這裏做錯了什麼? – CSharper

+0

是的,不要再次調用'DataBind'。 – mclark1129

+0

我明白了,但現在我必須點擊兩次'編輯'和'取消'。首先點擊它沒有做任何事情。 – CSharper

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

簡單地將數據綁定代碼移動到單獨的方法在功能上與原始問題沒有什麼不同。您必須將數據綁定與新增示例中列的添加分開。 – mclark1129

+0

是的,需要刪除Fill_Grid()中的所有列,順便說一句,謝謝@MikeC –

+0

我同意'邁克C',因爲我試過這種方法,基本上它是做同樣的事情。 – CSharper

相關問題