如何在GridView中添加删除链接,同时从C#添加新行?

如何在GridView中添加删除链接,同时从C#添加新行?,c#,asp.net,gridview,datatable,newrow,C#,Asp.net,Gridview,Datatable,Newrow,GridView包含ShowDeleteButton命令字段以及其他文本框字段 我在C#中向这个网格添加新行,即为每个新添加的行添加新的文本框。如何在添加新行时添加删除链接 私有void AddNewRow() { DataTable dt=新的DataTable(); 数据行dr; Add(newsystem.Data.DataColumn(“问题”,typeof(字符串)); 添加(新的System.Data.DataColumn(“应答”,typeof(字符串)); forea

GridView包含ShowDeleteButton命令字段以及其他文本框字段

我在C#中向这个网格添加新行,即为每个新添加的行添加新的文本框。如何在添加新行时添加删除链接


私有void AddNewRow()
{   
DataTable dt=新的DataTable();
数据行dr;
Add(newsystem.Data.DataColumn(“问题”,typeof(字符串));
添加(新的System.Data.DataColumn(“应答”,typeof(字符串));
foreach(Gridview1.Rows中的GridViewRow行)
{
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.NewRow());
dt.Rows[dt.Rows.Count-1][“问题”]=”;
dt.Rows[dt.Rows.Count-1][“答案”]=”;
dt.AcceptChanges();
Gridview1.EditIndex=dt.Rows.Count-1;
Gridview1.DataSource=dt;
Gridview1.DataBind();
}

我建议您只需在每行中添加删除按钮即可。这样用户就可以轻松地删除一行

我还建议您使用datatable加载网格一次,然后将行添加到datatable,而不是网格

我可以写很多这种方法的优点。但也有一些好处:

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 server。如前所述,这还允许您保存整个表。其结果是用户可以编辑一行、多行-选项卡,就像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" />
请注意,我们在表单类中添加了一个MyTable。因此,我们有一个分散的表,我们对该表进行操作

事实上,如果数据来自SQL server,则可以使用与上述设计完全相同的设计。不仅更令人惊奇,而且我们现在可以通过一次更新操作将整个表保存并发送回sql server。(您只需循环网格,将值放回表中,然后执行一次保存)

而且上面没有凌乱的编辑按钮来编辑一行。我想我们可以为额外的标记添加一个删除确认框——如果用户碰到或点击删除按钮,他们会得到一个确认对话框。代码可能是这样的:

  <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?');"/>
如前所述,如果从sql server加载表中的数据,则上述整个过程也可以工作,其余代码“按原样”也可以工作

要将数据保存回sql server,您可以按说明执行以下操作:

将数据从网格拉回到该持久表。然后使用数据适配器,一个更新命令将所有更改发送回sql server

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