好的,有很多方法可以做到这一点。
您甚至可以使用/获取向导来为您进行编辑。但是,我发现内置的模板编辑系统真的很乱。
我来自桌面领域(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
(它与在组合框中选择学生的作用相同。
所以,以上是关于如何做到这一点的好主意。
实际上,它的代码并不多,而且您几乎可以使用上述方法进行任何类型的数据编辑。