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

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

GridView 包含 ShowDeleteButton CommandField 和其他文本框字段。

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

解决方法

我建议您简单地将删除按钮添加到每一行。这样用户就可以轻松删除一行。

我还建议您使用数据表加载网格一次,然后将行添加到数据表 - 而不是网格。

我可以写出大量这种方法的优点。但一些优点是:

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" />

当您放下按钮时(我使用了图像按钮),然后在代码编辑器中执行以下操作:

enter image description here

注意在你点击“=”之后,intel-sense 是如何弹出的 - 选择创建新事件。看起来什么也没发生,但如果你翻到后面的代码,你会看到生成了一个代码子。您不能双击网格内的控件,但可以通过这种方式为按钮创建单击事件 - 或者实际上是标准 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。因此,我们有一个 persited 表,我们针对该表进行操作。

实际上,如果数据来自 SQL 服务器,则可以使用与上面完全相同的设计。不仅更神奇,而且我们现在可以在一次更新操作中将整个表保存并发送回 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?');"/>

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

enter image description here

如果您单击确定 - 它会删除 - 取消 - 什么也不会发生。

因此,您可以通过以下方式节省大量代码和复杂性:

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 server 的数据加载表,则上述整个过程也将起作用 - 代码的 REST “按原样”将起作用。

并将数据保存回sql server,然后您可以按照说明:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?