在 Gridview 中插入行

传道人

我有一个从 SQLDataSource 填充的标准 Gridview。Gridview 将始终有 17 行。谁能给我一个示例,说明如何在指定的行位置手动将行插入其中?例如,在第 3 行和第 5 行中插入一个新行。

谢谢

阿尔伯特·D·卡拉勒

好吧,完全不清楚为什么说在第 5 行或第 8 行插入很重要?

还记得,当我们使用台式电脑时 - 单用户,或者说使用打孔卡?

然后输入的数据顺序没有问题。但是,我们现在不使用打孔卡,因此从数据库的角度来看,此类数据的顺序并不重要。我的意思是,如果您有多个用户输入数据,并且我在第 5 行插入,那么如果其他 3 个用户也这样做会发生什么情况。现在该记录排在第 8 位。因此,在此处引入“命令”或某些“位置”需要进一步的上下文 - 换句话说,这里的目标是什么?

使用数据库时,第一条规则是数据没有顺序。如果您需要某种顺序,比如输入日期,或者甚至说添加新记录的顺序,那么您的开发人员需要将其设计到您的软件中。

现在,说了以上?当然,存在类问题或说 UI 界面类型的问题,您可能会说 5 个盒子的顺序,并且您需要为用户提供以您希望的任何顺序重新排序这 5 个项目的能力。

好的,上面已经说了?

好吧,首先不清楚这些记录是如何输入的。并且不清楚存在于第 5 位的记录如何应该是第 5 条记录。

好的,现在不管以上了吗?

添加行、删除行或插入数据的技巧?在数据级别执行此操作,而不是在 gridview 级别执行此操作。这不仅分离了 UI 层,还有数据层?它还拯救了世界贫困和大量复杂代码。

因此,假设我们有一个名为“myorder”的列。如果表中没有此列,那么您确实非常需要添加它,因为正如我所说,某些数据顺序并不是凭空存在的,而是实际上必须“设计”和“管理”由你开发者!!!

所以,让我们用一个简单的 gv 像这样:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="ID" CssClass="table borderhide" >
    <Columns>
        <asp:TemplateField HeaderText="First" ><ItemTemplate>
                <asp:TextBox ID="txtFirst" runat="server" Text='<%# Eval("FirstName") %>' Width="80px">
                </asp:TextBox>
        </ItemTemplate></asp:TemplateField>
        <asp:TemplateField HeaderText="Last"><ItemTemplate>
                <asp:TextBox ID="txtLast" runat="server" Text='<%# Eval("LastName") %>' Width="80px">
                </asp:TextBox>
            </ItemTemplate></asp:TemplateField>
        <asp:TemplateField HeaderText="Hotel"><ItemTemplate>
                <asp:TextBox ID="txtHotel" runat="server" Text='<%# Eval("HotelName") %>'></asp:TextBox>
            </ItemTemplate></asp:TemplateField>
        <asp:TemplateField HeaderText="Description" ><ItemTemplate>
                <asp:TextBox ID="txtDescription" runat="server" Text='<%# Eval("Description") %>'
                    TextMode="MultiLine" Rows="3" Columns="45" 
                    ></asp:TextBox>
            </ItemTemplate></asp:TemplateField>
        <asp:TemplateField HeaderText="Active" ItemStyle-HorizontalAlign="Center" ><ItemTemplate>
            <asp:CheckBox ID="chkActive" runat="server" Checked='<%# Eval("Active") %>'  />
            </ItemTemplate></asp:TemplateField>

    </Columns>
</asp:GridView>

好的,我们的代码加载网格。如前所述,我们将保留网格的数据源,因为我们需要进行这些插入。

所以,我们要加载的代码:

Dim rstData As New DataTable

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then

        LoadData()
        LoadGrid()
    Else
        rstData = ViewState("rstData")
    End If

End Sub

Sub LoadData()
    Using conn As New SqlConnection(My.Settings.TEST4)

        Dim strSQL = "SELECT * FROM tblHotelsA ORDER BY MyOrder"
        Using cmdSQL As New SqlCommand(strSQL, conn)
            conn.Open()
            rstData.Load(cmdSQL.ExecuteReader)
        End Using
    End Using

End Sub

Sub LoadGrid()

    rstData.DefaultView.Sort = "MyOrder"
    GridView1.DataSource = rstData
    GridView1.DataBind()

    RowCount.Value = rstData.Rows.Count
    ViewState("rstData") = rstData

End Sub

我们现在有了这个:

在此处输入图像描述

所以,现在我们有了那个添加按钮。该按钮会将行添加到网格中,并提示我们输入位置(要插入的行)。

所以,按钮看起来像这样:

        <asp:Button ID="cmdSave" runat="server" Text="Save Changes"  style="float:left" CssClass="btn"/>
        <asp:Button ID="cmdAddRow" runat="server" Text="+Add New"  style="float:right" CssClass="btn"
            OnClientClick="return askwhatrow(this);"
            />

        <asp:HiddenField ID="WhatRow" runat="server"  ClientIDMode="Static"/>
        <asp:HiddenField ID="RowCount" runat="server" ClientIDMode="Static"/>

        <script>
            function askwhatrow(btn) {

                MyRowCount = $('#RowCount').val()

                strMsg = "There are row 1 to " + MyRowCount + "\n" +
                         "What row to insert new record?"

                strAns = prompt(strMsg)
                if (strAns === null) {
                    return false
                }

                if ((strAns < 1)  || (strAns > MyRowCount) ) {
                    alert("only 1 to " + MyRowCount + " is allowed")
                    return false
                }

                // ok, set the row insert location, and run our server side buttion
                $('#WhatRow').val(strAns)
                return true
            }

        </script>

因此,当我们单击添加行时,我们会收到以下提示:

在此处输入图像描述

我当然输入了 2 (或者你的例子中的 5)。

js 代码会提示用户,但是如果用户点击取消,那么按钮代码(服务器后面的代码)将不会运行。添加数据行的代码现在如下所示:

Protected Sub cmdAddRow_Click(sender As Object, e As EventArgs) Handles cmdAddRow.Click

    ' add new row to grid at location choosen by user:
    GridToTable()     ' save any possbile edits by user

    Dim InsertLocation As Integer = WhatRow.Value

    For Each OneRow In rstData.Rows
        If Int(OneRow("MyOrder")) >= InsertLocation Then
            OneRow("MyOrder") += 1
        End If
    Next

    ' setup new row - some defaults
    Dim NewRow As DataRow = rstData.NewRow
    NewRow("MyOrder") = InsertLocation
    NewRow("Active") = False
    rstData.Rows.Add(NewRow)

    LoadGrid()

End Sub

同样,请注意添加该行数据非常容易。那是因为我们将行添加到表中,然后简单地重新绑定网格以显示该新记录。换句话说,不要试图操纵gv,而只是操纵数据!!!(这样我们就可以拯救世界贫困,而您不必编写太多代码而挨饿)。

因此,在我们执行上述操作后,我们会看到:

在此处输入图像描述

那么,上面的网格呢?您可以使用标签(几乎像 excel)。您可以编辑任何行,进行任何您想要的更改。

然后我们有一个保存按钮。所做的只是将 gv 数据发送回表,然后在一个操作中将数据发送回数据库。

代码如下所示:

Protected Sub cmdSave_Click(sender As Object, e As EventArgs) Handles cmdSave.Click
    GridToTable()

    Using conn As New SqlConnection(My.Settings.TEST4)

        Dim strSQL = "SELECT * FROM tblHotelsA"
        Using cmdSQL As New SqlCommand(strSQL, conn)
            conn.Open()
            Dim da As New SqlDataAdapter(cmdSQL)
            Dim daU As New SqlCommandBuilder(da)

            da.Update(rstData)
        End Using
    End Using


End Sub

Sub GridToTable()
    ' send all data from gv to local table

    For Each gvRow As GridViewRow In GridView1.Rows

        Dim pkID As Integer = GridView1.DataKeys(gvRow.RowIndex).Item("ID")
        Dim OneRow As DataRow = rstData.Select("ID = " & pkID).FirstOrDefault

        OneRow("FirstName") = CType(gvRow.FindControl("txtFirst"), TextBox).Text
        OneRow("LastName") = CType(gvRow.FindControl("txtLast"), TextBox).Text
        OneRow("HotelName") = CType(gvRow.FindControl("txtHotel"), TextBox).Text
        OneRow("Description") = CType(gvRow.FindControl("txtDescription"), TextBox).Text
        OneRow("Active") = CType(gvRow.FindControl("chkActive"), CheckBox).Checked

    Next

End Sub

所以在上面,我们发送所有的编辑,所有的添加(如果你有或添加一个删除按钮到每一行,那么即使删除都用上面简单的几行代码发送回数据库。如上所述,这是和是可能的,因为我们持久化了驱动 GV 的 rstData。

真的很好吗?那么,30 多年来,地球上每个使用 Excel、或使用任何会计系统或任何其他计算机软件的用户?他们可以在那个网格中反弹,做出改变。然后使用一个简单的保存按钮将整个 she-bang 发送回数据库。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章