我有一個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對象插入到數據庫中。我只是不知道爲什麼要防止這種情況發生。
任何幫助,將不勝感激。謝謝。