当前位置: 首页 > 知识库问答 >
问题:

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

逄俊贤
2023-03-14

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

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

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

共有1个答案

俞博涛
2023-03-14

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

我还建议您使用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。如前所述,这还允许您保存WHOLE表。其结果是,用户可以像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。因此,我们有一个分散的表,我们对该表进行操作。

事实上,如果数据来自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?');"/>

所以现在当你点击删除行,你会得到这个:

如果单击ok-它删除-取消-什么都不会发生。

因此,您可以节省大量的代码和复杂性:

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 server,您可以按说明执行以下操作:

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

 类似资料:
  • 问题内容: 我刚刚开始使用Sequelize和Sequelize CLI 由于这是开发时间,因此经常添加和删除列。在现有模型中添加新列的最佳方法是什么? 例如,我想将新列“ completed ”转换为 Todo 模型。我将此列添加到models / todo.js。下一步是什么? 我试过了 无法正常工作: “ 未 执行任何迁移,数据库架构已经是最新的。” 问题答案: 如果使用sequelize-

  • 问题内容: 我正在尝试创建一个代码块,该代码块将创建一个链接服务器/删除一个链接服务器。我曾发布过有关添加和删除函数的类似问题,解决方案是删除函数并重新创建它。 因此,我想对LinkServer采用相同的方法。每次运行此代码时,请删除它并重新创建它。 但是,删除后无法重新创建链接服务器,并且收到错误消息:服务器已存在。 这是我的代码: 问题答案: 实际上,这至少是SQL Server的副本:链接服

  • 问题内容: 由于IE9和Safari-5不支持,因此有什么替代的跨浏览器解决方案? 解决方案 必须 至少在 IE 9 , Safari 5 ,FireFox 4,Opera 11.5和Chrome中运行。 问题答案: 处理没有框架/库的类的一种方法是使用Element.className属性,该属性“ _获取并设置指定元素的class属性的值。 正如在他的回答中已经提到的那样,一旦获得了元素的类字

  • 我正在使用改装库,我想从OpenWeatherPi获取天气预报。 我有这个。

  • 问题内容: 我正在尝试将tinyMCE编辑器添加到我的页面,将其删除,然后再次添加,但出现错误。 当我运行A部分,然后运行B部分,而不是运行A部分时,出现错误: 甲部 B部分 编辑: 上面是创建JavaScript的后端分支,下面是完整的JavaScript函数。第一次通过它打开对话框并工作,其内容在编辑器中,没有错误。当我单击关闭按钮时,对话框关闭。当我再次运行该函数时,将显示对话框,但编辑器为

  • 问题内容: 我正在尝试转学;为此,我想删除神经网络的最后两层并添加另外两层。这是一个示例代码,它也会输出相同的错误。 我使用删除了该图层,但是当我尝试添加其输出时出现此错误 AttributeError:“模型”对象没有属性“添加” 我知道该错误的最可能原因是不当使用。我应该使用其他什么语法? 编辑: 我试图在keras中删除/添加图层,但不允许在加载外部重物后添加它。 它显示此错误 问题答案: