[英]How to add Delete link in GridView while adding new row from C#?
GridView 包含 ShowDeleteButton CommandField 以及其他文本框字段。
我在 C# 的這個網格中添加新行,為每個新添加的行添加新的文本框。 添加新行時如何添加刪除鏈接?
<asp:GridView ID="Gridview1" runat="server" ShowFooter="true" OnRowDataBound="Gridview1_OnRowDataBound" OnRowDeleting="Gridview1_RowDeleting" AutoGenerateColumns="false" ShowHeaderWhenEmpty="True" EmptyDataText="沒有可用記錄"> <asp: TemplateField HeaderText="Question"> <asp:TextBox ID="txtQuestion" runat="server" Text='<%# Eval("Question") %>'></asp:TextBox> </asp:TemplateField>
<asp:TemplateField HeaderText="Answer">
<ItemTemplate>
<asp:TextBox ID="txtAnswer" ReadOnly="true" Enabled="false" runat="server" Text='<%# Eval("Answer") %>'></asp:TextBox>
</ItemTemplate>
<FooterStyle HorizontalAlign="Right" />
<FooterTemplate>
<asp:Button ID="btnAddNewQuestionnaire" runat="server" Text="Add New Row" OnClick="btnAddNewQuestionnaire_Click" />
</FooterTemplate>
</asp:TemplateField>
<asp:CommandField ShowDeleteButton="true" />
</Columns>
</asp:GridView>
private void AddNewRow()
{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("Question", typeof(String)));
dt.Columns.Add(new System.Data.DataColumn("Answer", typeof(String)));
foreach (GridViewRow row in Gridview1.Rows)
{
TextBox txtQuestion = (TextBox)row.FindControl("txtQuestion");
TextBox txtAnswer = (TextBox)row.FindControl("txtAnswer");
dr = dt.NewRow();
dr[0] = txtQuestion.Text;
dr[1] = txtAnswer.Text;
dt.Rows.Add(dr);
}
dt.Rows.Add(dt.NewRow());
dt.Rows[dt.Rows.Count - 1]["Question"] = "";
dt.Rows[dt.Rows.Count - 1]["Answer"] = "";
dt.AcceptChanges();
Gridview1.EditIndex = dt.Rows.Count - 1;
Gridview1.DataSource = dt;
Gridview1.DataBind();
}
我建議您簡單地將刪除按鈕添加到每一行。 這樣用戶就可以輕松刪除一行。
我還建議您使用數據表加載網格一次,然后將行添加到數據表 - 而不是網格。
我可以寫出這種方法的一大堆優點。 但一些優點是:
user does not get presented with multiple UI
user can edit any row on the grid - not have to hit edit, or save
a single un-do button can un-do all changes
a single SAVE button in ONE operation can save the WHOLE TABLE and change back to database
您添加一行的代碼,以及設置和創建數據庫的代碼是分開的。 這意味着您可以更改數據表,甚至可以讓表的來源來自 sql 服務器。 如前所述,這還允許您保存整個表。 結果是用戶可以編輯一行,多行 - 像 excel 電子表格一樣圍繞着標簽。 完成后,他們可以:
hit save - all data back to database
hit un-do - un-do all their edits
hit + (add row) - add a new row to edit
hit delete key - it will delete the row in question (but UN-DO STILL ACTIVE!!!).
所以我們有一個更愉快的編輯方式。
因此,我建議您不要使用內置的刪除按鈕。 放入您自己的按鈕 - 無論如何它看起來會更好。 (因此也不需要編輯按鈕。!!!)。
所以,這是我們的標記:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server"
ImageUrl="~/Content/uncheck1.jpg" Height="35px" Width="45px"
OnClick="ImageButton1_Click"
MyRowID = '<%# Container.DataItemIndex %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Question">
<ItemTemplate>
<asp:TextBox ID="txtQuestion" runat="server" Text='<%# Eval("Question") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Answer">
<ItemTemplate>
<asp:TextBox ID="txtAnswer" runat="server" Text='<%# Eval("Answer") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<br />
<asp:Button ID="btnAddNewQuestionnaire" runat="server" Text="+Add New Row" OnClick="btnAddNewQuestionnaire_Click" />
當您放下按鈕時(我使用了圖像按鈕),然后在代碼編輯器中執行以下操作:
請注意在您點擊“=”后如何正確,然后英特爾感知彈出 - 選擇創建新事件。 看起來什么都沒有發生,但是如果你翻到后面的代碼,你會看到一個代碼子被生成了。 您不能雙擊網格內的控件,但可以為按鈕創建一個事件單擊 - 或者實際上是標准 asp.net 控件的任何事件。
為了拯救世界貧困,我還為該按鈕添加了一個名為 MyRowID 的自定義屬性 - 這將為該按鈕設置行索引。
由於添加新行按鈕在網格之外,所以我們可以雙擊該按鈕,然后跳轉到后面的代碼。
現在,我們的代碼如下所示:
private DataTable MyTable = new DataTable();
protected void Page_Load(object sender, System.EventArgs e)
{
if (IsPostBack == false)
{
LoadGrid();
ViewState["MyTable"] = MyTable;
}
else
MyTable = ViewState["MyTable"];
}
public void LoadGrid()
{
MyTable.Columns.Add(new DataColumn("Question", typeof(string)));
MyTable.Columns.Add(new DataColumn("Answer", typeof(string)));
GridView1.DataSource = MyTable;
GridView1.DataBind();
}
protected void btnAddNewQuestionnaire_Click(object sender, EventArgs e)
{
DataRow MyRow = MyTable.NewRow;
MyRow("Question") = "my question";
MyRow("Answer") = "my ans";
MyTable.Rows.Add(MyRow);
GridView1.DataSource = MyTable;
GridView1.DataBind();
}
protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
{
ImageButton btn = sender;
int RowID = btn.Attributes.Item("MyRowID");
MyTable.Rows(RowID).Delete();
GridView1.DataSource = MyTable;
GridView1.DataBind();
}
注意非常小心 - 我們將 MyTable 添加到 class 表格中。 因此,我們有一個持久化的表,並且我們針對該表進行操作。
事實上,如果數據來自 SQL 服務器,則可以使用與上述完全相同的設計。 不僅更令人驚奇,而且我們現在可以在一次更新操作中保存 + 將整個表發送回 sql 服務器。 (您只需循環網格,將值放回表中,然后執行一次保存)。
而且上面沒有凌亂的編輯按鈕來編輯一行。 我想我們可以為額外的標記添加一個刪除構造框 - 用戶如果他們碰撞或點擊刪除按鈕,他們會得到一個確認對話框。 該代碼可能是這樣的:
<asp:ImageButton ID="ImageButton1" runat="server"
ImageUrl="~/Content/uncheck1.jpg" Height="35px" Width="45px"
OnClick="ImageButton1_Click"
MyRowID = '<%# Container.DataItemIndex %>'
OnClientClick="return confirm('Delete this row?');"/>
所以現在當你點擊刪除行時,你會得到:
如果單擊確定 - 它會刪除 - 取消 - 沒有任何反應。
因此,您可以通過以下方式節省大量代碼和復雜性:
Persist the data table
Pass the row ID with the button
use the intel-sense trick to wire up a separate and specific button event code.
如前所述,如果您使用來自 sql 服務器的數據加載表,則上述整個過程也將起作用——“原樣”代碼的 REST 將起作用。
並將數據保存回 sql 服務器,然后您可以按照說明:
將數據從網格拉回該持久表。 然后使用數據適配器,一個更新命令會將所有更改發送回 sql 服務器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.