asp.net|datagrid|datagrid控件|优化 尽管在上面的实例中我们已经实现了DataGrid的在线编辑功能,但是,如果我们已经习惯了C/S 结构的程序,就会感觉到上个实例中编辑的不足:提交数据频繁,加重了服务器的负担。在这一节中,我们利用一个实例来演示优化后的DataGrid控件的编辑功能,其中的技术就是引入批量更新数据。引入的一个新知识就是控件的FindControl方法。
我们来看具体实例。首先在DataCon Web项目里,添加一个Web Form,命名为DataGrid_Sample6.aspx,然后添加一个DataGrid控件,由于我们做了DataGrid控件的显示模版,并且为了优化其编辑属性,我们特别利用<asp:TemplateColumn ><ItemTemplate></ItemTemplate></asp:TemplateColumn >属性添加了DropDownList控件和CheckBox控件。为了便于实例应用和读者理解,我们新建一个TeacherInfor.mdb数据库,该数据库包含一个teacher数据表 ,字段类型和虚拟数据如图9.11和9.12所示。
图9.11 teacher数据表中的字段属性
图9.12 teacher数据表中数据记录
DataGrid_Sample6.aspx的主要HTML代码如下:
<body topMargin="0" MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<FONT face="宋体"><b>经济管理学院教师信息</b>
<asp:DataGrid id="DataGrid1"
runat="server" AutoGenerateColumns="False" Width="320px" PageSize="4"
AllowPaging="True">
<AlternatingItemStyle BackColor="WhiteSmoke"></AlternatingItemStyle>
<ItemStyle BackColor="GhostWhite"></ItemStyle>
<HeaderStyle BackColor="LightSteelBlue"></HeaderStyle>
<Columns>
<asp:BoundColumn DataField="id" HeaderText="编号"></asp:BoundColumn>
<asp:BoundColumn DataField="name" HeaderText="姓名"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="性别">
<ItemTemplate>
<asp:DropDownList id="sex" runat="server" SelectedIndex='<%# Cint(DataBinder.Eval(Container,"DataItem.sex")) %>' >
<asp:ListItem Value="0">男</asp:ListItem>
<asp:ListItem Value="1">女</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="所获学位">
<ItemTemplate>
<asp:DropDownList id="degree" runat="server" SelectedIndex='<%# cint(DataBinder.Eval(Container,"DataItem.degree")) %>'>
<asp:ListItem Value="0">学士</asp:ListItem>
<asp:ListItem Value="1">硕士</asp:ListItem>
<asp:ListItem Value="2">博士</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="性别">
<ItemTemplate>
<asp:DropDownList id="title" runat="server" SelectedIndex='<%# Cint(DataBinder.Eval(Container,"DataItem.title")) %>' >
<asp:ListItem Value="0">讲师</asp:ListItem>
<asp:ListItem Value="1">副教授</asp:ListItem>
<asp:ListItem Value="2">教授</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="婚否">
<ItemTemplate>
<asp:CheckBox Runat=server Checked ='<%# DataBinder.Eval(Container,"DataItem.marry") %>' ID="marry" Text ="婚否">
</asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
<PagerStyle BackColor="LightSteelBlue" Mode="NumericPages"></PagerStyle>
</asp:DataGrid>
<asp:button id="Button1"
runat="server" Text="批量更新">
</asp:button></FONT>
</form>
</body>
在上面HTML代码中,注意DataGrid控件值的数据绑定:
SelectedIndex='<%# cint(DataBinder.Eval(Container,"DataItem.degree")) %>'
DataGrid_Sample6.aspx.vb中的逻辑代码如下:
'----code begin ----------
'-省略命名空间的引用
Public Class DataGrid_Sample6
Inherits System.Web.UI.Page
#Region " Web 窗体设计器生成的代码 "
'此处省略窗体设计器生成的代码
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
If Not IsPostBack Then
getdata()
End If
End Sub
'读取数据
Sub getdata()
Dim mycon As OleDb.OleDbConnection
viewstate("constr") = "provider=microsoft.jet.oledb.4.0;data source=" + Server.MapPath(".") + "\TeacherInfor.mdb"
'使用viewsate保存Connection连接字符串
Dim mycmd As OleDb.OleDbDataAdapter
'声明DataAdapter对象
Dim mysql As String
'声明Command命令的 SQL字符串
Try
mycon = New OleDb.OleDbConnection(viewstate("constr"))
'实例化Connection对象
mysql = "Select id,name, sex ,degree, title,marry from teacher"
'设置SQL语句,即查询数据库中所有内容
mycmd = New OleDb.OleDbDataAdapter(mysql, mycon)
Dim dt As Data.DataSet = New Data.DataSet
'声明DataSet对象,并实例话
mycmd.Fill(dt)
'填充数据,即在内存中生成DataSet模型数据库
DataGrid1.DataSource = dt.Tables(0)
'为DataGrid1控件指定数据源
DataGrid1.DataBind()
'执行绑定
Catch ex As Exception
Response.Write("程序出错,信息描述如下:
" & ex.Message)
Finally
mycon.Close()
End Try
End Sub
'翻页事件
Private Sub DataGrid1_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles DataGrid1.PageIndexChanged
DataGrid1.CurrentPageIndex = e.NewPageIndex
getdata()
End Sub
'批量更新过程
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim mysql As String
Dim sex As DropDownList
Dim degree As DropDownList
Dim title As DropDownList
Dim marry As CheckBox
Dim mycon As OleDb.OleDbConnection = New OleDb.OleDbConnection(viewstate("constr"))
mycon.Open()
Dim mycmd As OleDb.OleDbCommand
Try
Dim item As DataGridItem
'定义item变量,代表这DataGrid控件的每一个Item项
For Each item In DataGrid1.Items
'遍历DataGrid1的Item项
sex = item.FindControl("sex")
'利用FindControl方法实例化性别字段的列表控件
degree = item.FindControl("degree")
'利用FindControl方法实例化学位字段的列表控件
title = item.FindControl("title")
'利用FindControl方法实例化职称字段的列表控件
marry = item.FindControl("marry")
'利用FindControl方法实例化婚否字段的列表控件
'下面为mysql语句赋值,利用已经实例化的控件,就可以获取它的值。
mysql = "update teacher set sex='" & sex.SelectedValue & "',degree='" & degree.SelectedValue & "'," & _
"marry=" & marry.Checked & ",title='" & title.SelectedValue & "' where id=" & item.Cells(0).Text
mycmd = New OleDb.OleDbCommand(mysql, mycon)
'写入更新
mycmd.ExecuteNonQuery()
Next
Catch ex As Exception
Response.Write("程序出错,信息描述如下:
" & ex.Message)
Finally
mycon.Close()
Response.Write("<script>alert('恭喜您!\n你已经成功的更新了记录!');</script>")
'提示更新成功!
End Try
getdata()
End Sub
End Class
'------code end ---------
保存编译后,DataGrid_Sample6.aspx运行效果如图9.13所示。
如图9.13 DataGrid_Sample6.aspx运行效果