2012-03-13 61 views
2

我有一個GridView的問題。基本上我正在編寫一個飛機信息和跟蹤系統,並在此過程中瞭解gridview的奇妙之處,但是我無法在gridview中添加新行。我可以創建一個新行來輸入數據時,按下按鈕,但當我點擊更新,我有某種回發問題,導致數據被遺忘,無法找到一種方法。數據源是包含雙數和字符串的cargodoor對象列表,包含測量值,名稱等。這裏是我的代碼。asp.net和c#的問題保存從新行添加到gridview的新數據

<asp:UpdatePanel ChildrenAsTriggers="true" ID="UpdatePanel2" runat="server"> 
<ContentTemplate> 

<div id="divAddCargoDoor" style="width:100%" runat="server" class="AlignRight"> 
    <asp:LinkButton ID="lbAddNewCargoDoor" runat="server" 
     Text="<%$ Resources:ls, AddCargoDoor %>" 
     OnClick="lbAddNewCargoDoor_Click"></asp:LinkButton><br /><br /> 
</div> 

<div id="divCargoDoorNoDoors" runat="server"> 
    <asp:Label ID="lCargoDoorNoDoors" runat="server" 
     Text="<%$ Resources:ls, NoCargoDoors %>"></asp:Label> 
</div> 

<asp:GridView ID="gvCargoDoors" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="Id" Width="100%" 
     OnRowEditing="gvCargoDoors_RowEditing" 
     OnRowUpdating="gvCargoDoors_RowUpdating" 
     OnRowDeleting="gvCargoDoors_RowDeleting" 
     OnRowCancelingEdit="gvCargoDoors_RowCancellingEdit"> 

    <Columns> 
     <asp:CommandField AccessibleHeaderText="Edit" ShowEditButton="True" /> 
     <asp:TemplateField AccessibleHeaderText="Name" 
      HeaderText="<%$ Resources:ls, Description %>"> 
      <ItemTemplate> 
       <asp:Label ID="lName" runat="server" Text='<%# Bind("Name") %>' /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="Name" runat="server" Text='<%# Bind("Name") %>' /> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField AccessibleHeaderText="Width" 
      HeaderText="<%$ Resources:ls, Width %>"> 
      <ItemTemplate> 
       <asp:Label ID="lWidth" runat="server" Text='<%# Bind("Width") %>' /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="CDWidth" runat="server" Text='<%# Bind("Width") %>' /> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField AccessibleHeaderText="Height" 
      HeaderText="<%$ Resources:ls, Height %>"> 
      <ItemTemplate> 
       <asp:Label ID="lHeight" runat="server" Text='<%# Bind("Height") %>' /> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:TextBox ID="CDHeight" runat="server" Text='<%# Bind("Height") %>' /> 
      </EditItemTemplate> 
     </asp:TemplateField> 
     <asp:CommandField AccessibleHeaderText="Delete" ShowDeleteButton="True" 
      DeleteText="X" /> 
    </Columns> 
</asp:GridView> 
<br /> 
</ContentTemplate> 
</asp:UpdatePanel> 

現在的C#代碼

首先我們有這一塊會從被用於構建數據源數據庫中的信息。它調用一個簡單的SQL數據庫調用SQL Server 2008數據庫並返回一個飛機對象中的數據,其中包含一個cargodoor對象列表。

private void BuildDataSource() 
    { 
     this.ac = Charter.Aircraft.Retrieve(Convert.ToInt32(this.hfAircraftID.Value)); 
    } 

現在,這裏是實際貨艙門的代碼控制

private void BindCargoDoors() 
{ 
    if (ac.CargoDoors.Count == 0) 
    { 
     //display a label telling user there are no cargo doors 
     divCargoDoorNoDoors.Visible = true; 
    } 
    else 
    { 
     //bind the cargodoor object list to the gridview 
     divCargoDoorNoDoors.Visible = false; 
     this.gvCargoDoors.DataSource = this.ac.CargoDoors; 
     this.gvCargoDoors.DataBind(); 
    } 
} 

protected void gvCargoDoors_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    //get the index of the row and enter row editing mode 
    this.gvCargoDoors.EditIndex = e.NewEditIndex; 
    BuildDataSource(); 
    BindCargoDoors(); 
} 

protected void gvCargoDoors_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    //get the row being edited 
    GridViewRow row = this.gvCargoDoors.Rows[e.RowIndex]; 
    //create a new cargo door to store the info in 
    CargoDoor cd = new CargoDoor(); 

    //Retrieve the id of the cargodoor 
    cd.Id = Convert.ToInt32(gvCargoDoors.DataKeys[e.RowIndex].Values["Id"]); 

    if (cd.Id == 0) //will apply when new cargodoor is added 
    { 
     //fill in the cargodoor object from data in the row 
     cd.DateAdded = DateTime.Now; 
     cd.DateModified = DateTime.Now; 
     cd.Name = ((TextBox)row.FindControl("Name")).Text; 
     cd.Width = Convert.ToDouble(((TextBox)row.FindControl("Width")).Text); 
     cd.Height = Convert.ToDouble(((TextBox)row.FindControl("Height")).Text); 
     cd.Owner = this.ac.Owner; 
     cd.AircraftId = this.ac.Id; 

     //insert the new cargodoor into the database 
     Charter.Aircraft.InsertCargoDoor(cd); 
    } 
    else 
    { 
     //Retrieve old cargodoor info and fill in object info into cd 
     CargoDoor cdOrig = Charter.Aircraft.RetrieveCargoDoorByID(cd.Id); 
     //fill in the cargodoor object with retrieved info 
     cd.AircraftId = cdOrig.AircraftId; 
     cd.DateAdded = cdOrig.DateAdded; 
     cd.Notes = cdOrig.Notes; 
     cd.Owner = cdOrig.Owner; 

     //fill in updated information 
     cd.Name = ((TextBox)row.FindControl("Name")).Text; 
     cd.Width = Convert.ToInt32(((TextBox)row.FindControl("Width")).Text); 
     cd.Height = Convert.ToInt32(((TextBox)row.FindControl("Height")).Text); 
     cd.DateModified = DateTime.Now; 

     //save the new cargodoor info 
     Charter.Aircraft.UpdateCargoDoor(cd); 
    } 

    //rebuild data source to get new cargo door 
    BuildDataSource(); 

    //Reset the edit index. 
    this.gvCargoDoors.EditIndex = -1; 

    //Bind data to the GridView control. 
    BindCargoDoors(); 
} 

protected void gvCargoDoors_RowCancellingEdit(object sender, 
    GridViewCancelEditEventArgs e) 
{ 
    this.gvCargoDoors.EditIndex = -1; 
    BuildDataSource(); 
    BindCargoDoors(); 
} 

protected void gvCargoDoors_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    BuildDataSource(); 
    int id = Convert.ToInt32(gvCargoDoors.DataKeys[e.RowIndex].Values["Id"]); 
    Charter.Aircraft.DeleteCargoDoor(id); 
    BuildDataSource(); 
    BindCargoDoors(); 
} 

protected void lbAddNewCargoDoor_Click(object sender, EventArgs e) 
{ 
    //trigger the edit mode with an edit row index of 0 
    this.gvCargoDoors.SetEditRow(0); 
    //insert a new cargodoor into the source object 
    this.ac.CargoDoors.Insert(0, new CargoDoor()); 

    //bind the data 
    this.gvCargoDoors.DataSource = this.ac.CargoDoors; 
    BindCargoDoors(); 
} 

我最大的問題是與lbAddNewCargoDoor和行的編輯做。當更新鏈接被按下時,它忘記了添加了新行,因此只編輯已存在的行,而不是將新的cargodoor對象插入到數據庫中。我只是不知道爲什麼要防止這種情況發生。

任何幫助,將不勝感激。謝謝。

回答

0

嘗試改變(見語句順序的變化)

protected void lbAddNewCargoDoor_Click(object sender, EventArgs e) 
{ 
    //trigger the edit mode with an edit row index of 0 
    this.gvCargoDoors.SetEditRow(0); 
    //insert a new cargodoor into the source object 
    this.ac.CargoDoors.Insert(0, new CargoDoor()); 

    //bind the data 
    this.gvCargoDoors.DataSource = this.ac.CargoDoors; 
    BindCargoDoors(); 
} 

protected void lbAddNewCargoDoor_Click(object sender, EventArgs e) 
{ 
    //insert a new cargodoor into the source object 
    this.ac.CargoDoors.Insert(0, new CargoDoor()); 

    //bind the data 
    this.gvCargoDoors.DataSource = this.ac.CargoDoors; 

    //trigger the edit mode with an edit row index of 0 
    this.gvCargoDoors.SetEditRow(0); 

    BindCargoDoors(); 
} 

請注意,我不能添加評論(由於較少的聲譽)和我知道,這應該成爲評論。