【问题标题】:How to Bind dynamic Data of objects in vb .net or on .aspx page?如何在 vb .net 或 .aspx 页面上绑定对象的动态数据?
【发布时间】:2021-09-12 13:08:44
【问题描述】:

我有一个主题标记表,它是动态的,我想在我的 .aspx 页面上绑定这些数据,还想从页面将这些数据保存或编辑到数据库中。

表格:主题标记

主题标记 英语 70 数学 80 科学90 历史 60

我想保存在页面上,例如:

英语 70 将在此处的文本框中

数学 80

科学 90

历史 60

我可以更改文本框中的标记数据并将更新的数据保存到数据库中。

请帮助我在 asp.net 中找到这些东西。我在 .vb 中有 .aspx 页面和后端

【问题讨论】:

  • 请附上 sn-ps 显示您迄今为止的进度以及尝试的详细信息。社区喜欢回答您工作中的具体问题,但不太可能为您提供解决方案。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: asp.net aspxgridview


【解决方案1】:

好的,有很多方法可以做到这一点。

您甚至可以使用/获取向导来为您进行编辑。但是,我发现内置的模板编辑系统真的很乱。

我来自桌面领域(VB6、ms-access、foxpro),然后我不想编写大量代码,我主要想要一个拖放式的简单体验。

那么,如何为正在上课的学生编辑一些分数?

好吧,我假设我们的数据库中有 Student 和 StudentCourse 表。

(让我们保持简单!)

所以,假设我们有这个:

好的,所以我们需要一个组合框来选择一个学生,然后显示他们的课程。

所以,首先要说一个简单的组合框(下拉菜单)来选择学生。

然后我们可以显示课程,并让您编辑分数。然后是一个简单的保存按钮来保存我们的编辑。

好的,让我们进入下拉列表(组合框)。选择学生,然后放入课程的网格视图(用于显示和编辑)。

然后让我们插入一个按钮(用于保存编辑)。

事实上,让我们使用列表视图来代替gridview。它们非常相似,但我更喜欢 listview,因为它允许使用标准控件被放入网格显示中,然后是网格视图。 (但是,任何一种选择都有效——我只是更喜欢列表视图。而且它具有更多的自定义能力。所以花时间学习 lv 是非常值得的。

所以,我们有这个简单的标记:

<div style="margin:20px">
    <asp:Label ID="Label1" runat="server" Text="Select Student: " Font-Size="Large"></asp:Label>
    <asp:DropDownList ID="cboStudents" runat="server" Style="font-size:large;width:180px;margin-left:5px" 
        AutoPostBack="true"
        DataTextField = "FullName"
        DataValueField ="ID">
    </asp:DropDownList>
    <br />
    <br />
    <div  style="width:25%;border:solid;border-width:thin">
        <style>  input {border:none}</style>
        <asp:ListView ID="LstMarks" runat="server" DataKeyNames="ID" >
            <ItemTemplate>
                <tr style="">
                    <td><asp:Textbox ID="Course" runat="server" Text='<%# Eval("Course") %>' /></td>
                    <td><asp:Textbox ID="Mark" runat="server" Text='<%# Eval("Mark") %>' Width="30px"/></td>
                    <td>
                        <asp:CheckBox ID="DoneLabs" runat="server" Checked = '<%# Eval("DoneLabs") %>' Width="30px"/>
                    </td>
                </tr>
            </ItemTemplate>
            <LayoutTemplate>
                <table id="itemPlaceholderContainer" runat="server" border="0" class="table">
                    <tr runat="server" style="">
                        <th runat="server" >Course</th>
                        <th runat="server">Mark</th>
                        <th runat="server" >Completed Lab Work</th>
                    </tr>
                    <tr id="itemPlaceholder" runat="server">
                    </tr>
                </table>
            </LayoutTemplate>
        </asp:ListView>
    </div>

    <br />
    <asp:Button ID="cmdSave" runat="server" Text="Save" class="btn"/>
    <asp:Button ID="cmdAdd" runat="server" Text="Add Course" class="btn" Style="margin-left:20px" />
    <asp:Button ID="cmdUndo" runat="server" Text="Undo Edits" class="btn" Style="margin-left:20px" />
</div>

好的,让我们编写代码来填充该组合框。

在项目设置中,我们在这里添加数据库连接字符串:

(它会为您提供网络配置 - 但这种方式非常简单 - 您可以使用连接字符串构建器)。

好的,现在让我们编写代码来加载组合框

我们有这个:

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

    If Not IsPostBack Then
        cboStudents.DataSource =
            MyRst("SELECT *, FirstName + ' ' + LastName AS FullName from Students ORDER BY FirstName")
        cboStudents.DataBind()
        cboStudents.Items.Insert(0, "")
    Else
        rstMarks = ViewState("MyMarks")
    End If

End Sub

所以在上面,我们加载了我们的组合框,并且我们还有一个用于标记表的表(我们保留了 rstMarks 表 - 因为我们需要它来进行编辑)。

好的,所以我们选择一个学生,然后填充列表视图。

该代码如下所示:

Protected Sub cboStudents_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboStudents.SelectedIndexChanged

    LoadMarks()

End Sub

Sub LoadMarks()

    Dim strSQL As String
    strSQL = "SELECT * from StudentCourses WHERE Student_ID = " & cboStudents.SelectedValue &
             " ORDER BY Course"
    rstMarks = MyRst(strSQL)
    LstMarks.DataSource = rstMarks
    LstMarks.DataBind()

    ViewState("MyMarks") = rstMarks

End Sub

我们的输出现在是这样的:

因此,您现在可以四处切换,设置课程名称、标记,然后我为了好玩而添加了一个复选框,以表示已完成“实验室”工作。

所以,现在我们需要保存按钮代码。在用户选择标签、编辑任何标记或更改复选框后,我们必须将编辑发送回数据库。

该代码如下所示:

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

    GridToTable()
    SaveToDB()

End Sub

Sub GridToTable()

    ' move grid edits back to table.
    For Each gRow As ListViewItem In LstMarks.Items

        Dim OneRow As DataRow = rstMarks.Rows(gRow.DataItemIndex)
        OneRow("Course") = CType(gRow.FindControl("Course"), TextBox).Text
        OneRow("Mark") = CType(gRow.FindControl("Mark"), TextBox).Text
        OneRow("DoneLabs") = CType(gRow.FindControl("DoneLabs"), CheckBox).Checked

    Next

End Sub

Sub SaveToDB()

    Using cmdSQL As New SqlCommand("SELECT * FROM StudentCourses WHERE ID = 0",
                    New SqlConnection(My.Settings.TEST4))
        Dim da As New SqlDataAdapter(cmdSQL)
        Dim daSQL As New SqlCommandBuilder(da)
        da.Update(rstMarks)
    End Using

End Sub

那么上面是做什么的呢?它将网格值移回表格。

THEN 将数据表(包含编辑内容,甚至添加新行)发送回数据库。

仅此而已。

我添加了一个添加课程按钮,代码如下:

Protected Sub cmdAdd_Click(sender As Object, e As EventArgs) Handles cmdAdd.Click

    GridToTable()         ' user might have made edits - send them to table
    ' add a new row to table
    Dim OneRow As DataRow = rstMarks.NewRow
    OneRow("Student_ID") = cboStudents.SelectedItem.Value
    OneRow("DoneLabs") = False
    OneRow("Mark") = 0

    rstMarks.Rows.Add(OneRow)
    LstMarks.DataSource = rstMarks     ' send table to grid
    LstMarks.DataBind()

End Sub

我确实创建了一个辅助例程来将数据放入表中,该代码是:

Function MyRst(strSQL As String) As DataTable

    Dim rstData As New DataTable
    Using cmdSQL As New SqlCommand(strSQL, New SqlConnection(My.Settings.TEST4))
        cmdSQL.Connection.Open()
        rstData.Load(cmdSQL.ExecuteReader)
    End Using

    Return rstData

End Function

还有撤消编辑按钮?它只是重新加载网格而不保存,因此是这样的:

Protected Sub cmdUndo_Click(sender As Object, e As EventArgs) Handles cmdUndo.Click

    LoadMarks()

End Sub

(它与在组合框中选择学生的作用相同。

所以,以上是关于如何做到这一点的好主意。

实际上,它的代码并不多,而且您几乎可以使用上述方法进行任何类型的数据编辑。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多