GridView实战一:自定义分页、排序、修改、插入、删除

前言:

  在某次公司面试时被问到对GridView操作的熟悉程度,在那之前一直用Repeater内嵌table标签对GridView操作确实很少,于是最近在项目的后台上对GridView进行了一番实操,本文和后面的另一篇GridView实战二:使用ObjectDataSource数据源控件均是这段时间的一些总结。

  GridView优点就是集数据绑定、分页、排序、删、改于一身,提高了开发效率;缺点嘛,就是运行效率低,并且它本身不带添加功能。于是GridView用于后台开发是一个不错的选择,而前台页面还是少用为妙咯。

 

实战一:

  1.本次实战效果图如下:

图一.展示状态

图二.编辑状态

图三.添加记录状态

2.具体代码

.aspx页面

复制代码
  1         <asp:GridView runat="server" ID="gv" AutoGenerateColumns="false"
2 AllowPaging="true" PageSize="1" AllowSorting="true" DataKeyNames="ID"
3 OnRowDataBound="gv_OnRowDataBound" OnRowDeleting="gv_OnRowDeleting"
4 OnRowEditing="gv_OnRowEditing" OnRowCancelingEdit="gv_OnRowCancelingEdit"
5 OnRowUpdating="gv_OnRowUpdating" OnSorting="gv_OnSorting">
6 <HeaderStyle BackColor="graytext" />
7 <Columns>
8 <asp:TemplateField>
9 <HeaderStyle Width="20%" />
10 <HeaderTemplate>
11 <asp:LinkButton runat="server" ID="lbtnSortName" Text="Name" CommandName="Sort" CommandArgument="Name">
12 </asp:LinkButton>
13 </HeaderTemplate>
14 <ItemTemplate><%#Eval("Name") %></ItemTemplate>
15 <EditItemTemplate>
16 <asp:TextBox runat="server" ID="tbxName" Text='<%#Eval("Name") %>'></asp:TextBox>
17 <asp:RegularExpressionValidator runat="server" ID="revName" ControlToValidate="tbxName"
18 ValidationExpression="[a-zA-Z]+" ErrorMessage="Please input your English name!" Display="Dynamic">
19 </asp:RegularExpressionValidator>
20 <asp:RequiredFieldValidator runat="server" ID="rfvName" ControlToValidate="tbxName"
21 ErrorMessage="Please input your name" Display="Dynamic">
22 </asp:RequiredFieldValidator>
23 </EditItemTemplate>
24 </asp:TemplateField>
25 <asp:TemplateField>
26 <HeaderStyle Width="10%"/>
27 <HeaderTemplate>
28 <asp:LinkButton runat="server" ID="lbtnSortSex" Text="Sex" CommandName="Sort" CommandArgument="Sex">
29 </asp:LinkButton>
30 </HeaderTemplate>
31 <ItemTemplate>
32 <asp:RadioButtonList Enabled="false" runat="server" ID="rblSexShow" RepeatDirection="Horizontal"
33 RepeatColumns="2">
34 </asp:RadioButtonList>
35 </ItemTemplate>
36 <EditItemTemplate>
37 <asp:RadioButtonList runat="server" ID="rblSexEdit" RepeatDirection="Horizontal" RepeatColumns="2">
38 </asp:RadioButtonList>
39 </EditItemTemplate>
40 </asp:TemplateField>
41 <asp:TemplateField>
42 <HeaderStyle Width="20%"/>
43 <HeaderTemplate>
44 <asp:LinkButton runat="server" ID="lbtnSortCountry" Text="Country" CommandName="Sort" CommandArgument="Country">
45 </asp:LinkButton>
46 </HeaderTemplate>
47 <ItemTemplate><%#Eval("Country")%></ItemTemplate>
48 <EditItemTemplate>
49 <asp:DropDownList runat="server" ID="ddlCountry"></asp:DropDownList>
50 </EditItemTemplate>
51 </asp:TemplateField>
52 <asp:TemplateField>
53 <HeaderStyle Width="20%"/>
54 <HeaderTemplate>Hobby</HeaderTemplate>
55 <ItemTemplate><%#Eval("Hobby") %></ItemTemplate>
56 <EditItemTemplate>
57 <asp:CheckBoxList runat="server" ID="cbxlHobby" RepeatDirection="Horizontal" RepeatColumns="5">
58 </asp:CheckBoxList>
59 </EditItemTemplate>
60 </asp:TemplateField>
61 <asp:TemplateField ItemStyle-HorizontalAlign="Center">
62 <HeaderStyle Width="10%"/>
63 <HeaderTemplate>
64 <asp:LinkButton runat="server" ID="lbtnShowAdd" Text="Add" OnClick="lbtnShowAdd_OnClick">
65 </asp:LinkButton>
66 </HeaderTemplate>
67 <ItemTemplate>
68 <asp:LinkButton runat="server" ID="lbtnEdit" Text="Edit" CommandName="Edit" />&emsp;
69 <asp:LinkButton runat="server" ID="lbtnDelete" Text="Delete" CommandName="Delete" />
70 </ItemTemplate>
71 <EditItemTemplate>
72 <asp:LinkButton runat="server" ID="lbtnSubmit" Text="Update" CommandName="Update" />&emsp;
73 <asp:LinkButton runat="server" ID="lbtnCancel" Text="Cancel" CommandName="Cancel" />
74 </EditItemTemplate>
75 </asp:TemplateField>
76 </Columns>
77 <PagerSettings Visible="true" />
78 <PagerStyle Font-Size="12px"/>
79 <PagerTemplate>
80 <div style="float:left;margin-left:15px;color:#999;line-height:20px">
81 当前第<%#this.gv.PageIndex+1 %>/<%#this.gv.PageCount %>页
82 </div>
83 <div style="float:right;margin-right:15px;color:#999;line-height:20px">页</div>
84 <div style="float:right">
85 <asp:DropDownList runat="server" ID="ddlPaging" AutoPostBack="true"
86 OnSelectedIndexChanged="ddlPaging_OnSelectedIndexChanged">
87 </asp:DropDownList>
88 </div>
89 <div style="float:right;color:#999;line-height:20px">跳转到第</div>
90 </PagerTemplate>
91 <EmptyDataTemplate>
92 <div><b>Name:</b>
93 <asp:TextBox runat="server" ID="tbxName"></asp:TextBox>
94 <asp:RegularExpressionValidator runat="server" ID="revName" ControlToValidate="tbxName"
95 ValidationExpression="^[a-zA-Z]+$" Display="Dynamic" ErrorMessage="Please input your English name!">
96 </asp:RegularExpressionValidator>
97 <asp:RequiredFieldValidator runat="server" ID="rfvName" ControlToValidate="tbxName"
98 ErrorMessage="Please input your name" Display="Dynamic">
99 </asp:RequiredFieldValidator>
100 </div>
101 <div><b>Sex:</b>
102 <asp:RadioButtonList runat="server" id="rblSex" RepeatColumns="2" RepeatDirection="Horizontal">
103 <asp:ListItem Value="M" Text="Male" Selected="True"></asp:ListItem>
104 <asp:ListItem Value="F" Text="Female"></asp:ListItem>
105 </asp:RadioButtonList>
106 </div>
107 <div><b>Country:</b>
108 <asp:DropDownList runat="server" ID="ddlCountry">
109 </asp:DropDownList>
110 <asp:RequiredFieldValidator runat="server" ID="rfCountry" ControlToValidate="ddlCountry"
111 ErrorMessage="Please Choose Country" Display="Dynamic">
112 </asp:RequiredFieldValidator>
113 </div>
114 <div><b>Hobby:</b>
115 <asp:CheckBoxList runat="server" ID="cbxlHobby" RepeatColumns="5" RepeatDirection="Horizontal">
116 </asp:CheckBoxList>
117 </div>
118 <div>
119 <asp:LinkButton runat="server" ID="lbtnSubmit" Text="Submit" OnClick="lbtnSubmit_OnClick" />
120 <asp:LinkButton runat="server" ID="lbtnCancel" Text="Cancel" OnClick="lbtnCancel_OnClick"
121 CausesValidation="false"/>
122 </div>
123 </EmptyDataTemplate>
124 </asp:GridView>
复制代码

说明:

1.显示状态时:对于只显示文字串的用<%#Eval("字段名")%>直接绑定,而对于单选组(性别)的内容就放在GridView的OnRowDataBound来绑定。

2.编辑状态时:复选组、单选组合下拉列表都在OnRowDataBound来绑定;这里没有用数据源控件,所以用<%#Bind("字段名")%>和<%#Eval("字段名")%>没区别,<%#Bind("字段名")%>的双向通讯不起作用。

3.新增状态:因为GridView自身附带新增记录的功能,所以选择在EmptyDataTemplate中实现新增的功能(借鉴其他同行的做法!);因为使用了验证控件,所以把取消按钮(操作不验证合法性)设为不触发验证。

4.分页功能:本例是将分页功能放置到gridview的PagerTemplate中实现。这里有两个注意点:

a.DropDownList设置AutoPostBack为true;

b.因为要触发DropDownList的OnSelectedIndexChanged事件,所以viewstate要启用。触发OnSelectedIndexChanged事件的条件是postback的selectedIndex和原始值不同,当viewstate启用时原始值就是viewstate中保存的值,当viewstate禁用时就是控件初始化时的selectedIndex或第一个选项。因此如果禁用了ViewState那么当选择回控件初始化时的选项时就不会触发OnSelectedIndexChanged事件了。

c.GridView的OnRowDataBound中每次postback都重新初始化DropDownList。因为DropDownList包含在GridView中是动态生成的,当PostBack时GridView并不会恢复其中的动态内容;如果把分页功能放在GridView以外实现,那么动态生成的时DropDownList的选项,就Postback时不用再初始化了。

d.因为DropDownList位于GridView里面,所以当把某个ListItem的enable设为false时,该选项就不生成(连Html代码都没了),如果放在GridView外只是显示为不可用而已,原因不明。为实现添加状态初始画面中存在默认不可选的listitem效果,用了html的disabled属性来设置。

 

.aspx.cs代码

复制代码
  1 public partial class _Default : System.Web.UI.Page 
2 {
3 private DataManager dm = new DataManager();
4
5 protected void Page_Load(object sender, EventArgs e)
6 {
7 if (!IsPostBack)
8 {
9 this.gv.DataSource = dm.GetDt();
10 this.gv.DataBind();
11
12 //记录最近一次排序方向
13 ViewState["Direction"] = SortDirection.Descending;
14 }
15 }
16
17 protected void gv_OnRowDataBound(object sender, GridViewRowEventArgs e)
18 {
19 DataRowView drv = e.Row.DataItem as DataRowView;
20
21 if (e.Row.RowType == DataControlRowType.DataRow)
22 {
23 //显示时
24 if (this.gv.EditIndex == -1)
25 {
26 //设置性别
27 RadioButtonList rbl = e.Row.FindControl("rblSexShow") as RadioButtonList;
28 rbl.Items.Add(new ListItem("Male", "M"));
29 rbl.Items.Add(new ListItem("Female", "F"));
30 if ((drv["Sex"] as string).ToLower().Equals("m"))
31 rbl.Items[0].Selected = true;
32 else
33 rbl.Items[1].Selected = true;
34 }
35 //修改时:
36 else if(e.Row.RowIndex == this.gv.EditIndex)
37 {
38 //性别
39 RadioButtonList rbl = e.Row.FindControl("rblSexEdit") as RadioButtonList;
40 rbl.Items.Add(new ListItem("Male", "M"));
41 rbl.Items.Add(new ListItem("Female", "F"));
42 if ((drv["Sex"] as string).ToLower().Equals("m"))
43 rbl.Items[0].Selected = true;
44 else
45 rbl.Items[1].Selected = true;
46 //国籍
47 DropDownList ddlCountry = e.Row.FindControl("ddlCountry") as DropDownList;
48 DataTable countryDt = dm.GetCountry();
49 ListItem li = null;
50 for(int i=0;i<countryDt.Rows.Count;++i)
51 {
52 string cn = countryDt.Rows[i]["cn"] as string;
53 li = new ListItem(cn, cn);
54 if (cn.Equals(drv["Country"] as string))
55 li.Selected = true;
56 ddlCountry.Items.Add(li);
57 }
58 //兴趣
59 CheckBoxList cbl = e.Row.FindControl("cbxlHobby") as CheckBoxList;
60 DataTable hobbyDt = dm.GetHobby();
61 string hobbys = drv["Hobby"] as string;
62 ListItem hobbyLi = null;
63 string hstr = string.Empty;
64 for (int i = 0; i < hobbyDt.Rows.Count; i++)
65 {
66 hstr = hobbyDt.Rows[i]["hobby"] as string;
67 hobbyLi = new ListItem(hstr, hstr);
68 if (hobbys.IndexOf(hstr)>=0)
69 hobbyLi.Selected = true;
70 cbl.Items.Add(hobbyLi);
71 }
72 }
73 }
74 else if (e.Row.RowType == DataControlRowType.Pager)
75 {
76 //绑定分页控件
77 DropDownList ddlPaging = e.Row.FindControl("ddlPaging") as DropDownList;
78 for (int i = 0; i < this.gv.PageCount; i++)
79 {
80 ddlPaging.Items.Add(new ListItem(Convert.ToString(i + 1), Convert.ToString(i)));
81 }
82 ddlPaging.SelectedIndex = this.gv.PageIndex;
83 }
84 else if (e.Row.RowType == DataControlRowType.EmptyDataRow)
85 {
86 //添加记录画面
87 //国籍
88 DropDownList ddlCountry = e.Row.FindControl("ddlCountry") as DropDownList;
89 DataTable countryDt = dm.GetCountry();
90 ListItem li = new ListItem("Please Select","");
91 li.Attributes["disabled"] = "disabled";
92 li.Selected = true;
93 ddlCountry.Items.Add(li);
94 for (int i = 0; i < countryDt.Rows.Count; ++i)
95 {
96 string cn = countryDt.Rows[i]["cn"] as string;
97 li = new ListItem(cn, cn);
98 ddlCountry.Items.Add(li);
99 }
100 //兴趣
101 CheckBoxList cbl = e.Row.FindControl("cbxlHobby") as CheckBoxList;
102 DataTable hobbyDt = dm.GetHobby();
103 ListItem hobbyLi = null;
104 string hstr = string.Empty;
105 for (int i = 0; i < hobbyDt.Rows.Count; i++)
106 {
107 hstr = hobbyDt.Rows[i]["hobby"] as string;
108 hobbyLi = new ListItem(hstr, hstr);
109 cbl.Items.Add(hobbyLi);
110 }
111 }
112 }
113
114 /// <summary>
115 /// 分页控件的OnSelectedIndexChanged
116 /// </summary>
117 /// <param name="sender"></param>
118 /// <param name="e"></param>
119 protected void ddlPaging_OnSelectedIndexChanged(object sender, EventArgs e)
120 {
121 this.gv.PageIndex = (sender as DropDownList).SelectedIndex;
122 this.gv.DataSource = dm.GetDt();
123 this.gv.DataBind();
124 }
125
126 /// <summary>
127 /// 删除记录
128 /// </summary>
129 /// <param name="sender"></param>
130 /// <param name="e"></param>
131 protected void gv_OnRowDeleting(object sender, GridViewDeleteEventArgs e)
132 {
133 dm.DelRecord(Convert.ToInt32(this.gv.DataKeys[e.RowIndex].Value));
134 this.gv.PageIndex = 0;
135 this.gv.DataSource = dm.GetDt();
136 this.gv.DataBind();
137 }
138
139 /// <summary>
140 /// 修改记录
141 /// </summary>
142 /// <param name="sender"></param>
143 /// <param name="e"></param>
144 protected void gv_OnRowEditing(object sender, GridViewEditEventArgs e)
145 {
146 this.gv.EditIndex = e.NewEditIndex;
147 this.gv.DataSource = dm.GetDt();
148 this.gv.DataBind();
149 }
150
151 /// <summary>
152 /// 取消修改
153 /// </summary>
154 /// <param name="sender"></param>
155 /// <param name="e"></param>
156 protected void gv_OnRowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
157 {
158 this.gv.EditIndex = -1;
159 this.gv.DataSource = dm.GetDt();
160 this.gv.DataBind();
161 }
162
163 /// <summary>
164 /// 更新记录
165 /// </summary>
166 /// <param name="sender"></param>
167 /// <param name="e"></param>
168 protected void gv_OnRowUpdating(object sender, GridViewUpdateEventArgs e)
169 {
170 GridViewRow gvr = this.gv.Rows[e.RowIndex];
171 int id = Convert.ToInt32(this.gv.DataKeys[e.RowIndex].Value);
172 string name = (gvr.Cells[0].FindControl("tbxName") as TextBox).Text;
173 string sex = (gvr.Cells[1].FindControl("rblSexEdit") as RadioButtonList).SelectedValue;
174 string country = (gvr.Cells[2].FindControl("ddlCountry") as DropDownList).SelectedValue;
175 System.Text.StringBuilder hobbys = new System.Text.StringBuilder();
176 foreach (ListItem li in (gvr.Cells[3].FindControl("cbxlHobby") as CheckBoxList).Items)
177 {
178 if (li.Selected)
179 hobbys.Append(li.Value+",");
180 }
181 if (hobbys.Length >= 2)
182 hobbys.Remove(hobbys.Length - 1, 1);
183 dm.UpdateRecord(id, name, country, sex, hobbys.ToString());
184
185 this.gv.EditIndex = -1;
186 this.gv.DataSource = dm.GetDt();
187 this.gv.DataBind();
188 }
189
190 /// <summary>
191 /// 提交新记录
192 /// </summary>
193 /// <param name="sender"></param>
194 /// <param name="e"></param>
195 protected void lbtnSubmit_OnClick(object sender, EventArgs e)
196 {
197 LinkButton lbtnSubmit = sender as LinkButton;
198 GridViewRow tr = lbtnSubmit.NamingContainer as GridViewRow;
199 string name = (tr.Cells[0].FindControl("tbxName") as TextBox).Text;
200 string sex = (tr.Cells[0].FindControl("rblSex") as RadioButtonList).SelectedValue;
201 string country = (tr.Cells[0].FindControl("ddlCountry") as DropDownList).SelectedValue;
202 System.Text.StringBuilder hobbys = new System.Text.StringBuilder();
203 foreach (ListItem li in (tr.Cells[0].FindControl("cbxlHobby") as CheckBoxList).Items)
204 {
205 if (li.Selected)
206 hobbys.Append(li.Value + ",");
207 }
208 if (hobbys.Length >= 2)
209 hobbys.Remove(hobbys.Length - 1, 1);
210 dm.AddRecord(name,country,sex,hobbys.ToString());
211
212 this.gv.PageIndex = 0;
213 this.gv.DataSource = dm.GetDt();
214 this.gv.DataBind();
215 }
216
217 /// <summary>
218 /// 退出添加新记录
219 /// </summary>
220 /// <param name="sender"></param>
221 /// <param name="e"></param>
222 protected void lbtnCancel_OnClick(object sender, EventArgs e)
223 {
224 this.gv.DataSource = dm.GetDt();
225 this.gv.DataBind();
226 }
227
228 /// <summary>
229 /// 显示添加画面
230 /// </summary>
231 /// <param name="sender"></param>
232 /// <param name="e"></param>
233 protected void lbtnShowAdd_OnClick(object sender, EventArgs e)
234 {
235 this.gv.DataSource = null;
236 this.gv.DataBind();
237 }
238
239 /// <summary>
240 /// 排序
241 /// </summary>
242 /// <param name="sender"></param>
243 /// <param name="e"></param>
244 protected void gv_OnSorting(object sender, GridViewSortEventArgs e)
245 {
246 DataTable dt = dm.GetDt();
247 string direction = string.Empty;
248 if (e.SortDirection == (SortDirection)Enum.Parse(typeof(SortDirection),Convert.ToString(ViewState["Direction"])))
249 direction = "asc";
250 else
251 direction = "desc";
252 dt.DefaultView.Sort = string.Format("{0} {1}", e.SortExpression, direction);
253 ViewState["Direction"] = (direction.Equals("asc") ? SortDirection.Descending : SortDirection.Ascending);
254 this.gv.DataSource = dt;
255 this.gv.DataBind();
256 }
257 }
复制代码

说明:

1.显示、编辑、新增时数据绑定都集中在gv_OnRowDataBound方法中,通过e.Row.RowType来分别处理。

2.排序:通过DataTable.DefaultView来实现,用一个ViewState变量存放最近一次的排序方向的反方向,来使每次排序的方向都不同。GridView的SortDirection为只读属性,所以别指望设定它来实现排序哦!

3.modify、update、delete和cancel按钮的实现利用GridView预设的CommandName来处理

 

CommandName 值

说明

“Cancel”

取消编辑操作并将 GridView 控件返回为只读模式。引发 RowCancelingEdit 事件。

“Delete”

删除当前记录。引发 RowDeleting 和 RowDeleted 事件。

“Edit”

将当前记录置于编辑模式。引发 RowEditing 事件。

“Page”

执行分页操作。将按钮的 CommandArgument 属性设置为“First”、“Last”、“Next”、“Prev”或页码,以指定要执行的分页操作类型。引发 PageIndexChanging 和 PageIndexChanged 事件。

“Select”

选择当前记录。引发 SelectedIndexChanging 和 SelectedIndexChanged 事件。

“Sort”

对 GridView 控件进行排序。引发 Sorting 和 Sorted 事件。

“Update”

更新数据源中的当前记录。引发 RowUpdating 和 RowUpdated 事件。

 

当然也可以自己写OnCommand的处理代码来处理,就是烦一点。

 

数据操作类:

复制代码
  1 public class DataManager
2 {
3 private static DataTable dt = null;//用户记录
4 private static DataTable countryDt = null;//国籍
5 private static DataTable hobbyDt = null;//兴趣
6
7 public DataManager()
8 {
9 if (dt == null)
10 {
11 dt = new DataTable();
12 dt.Columns.Add("ID");
13 dt.Columns.Add("Name");
14 dt.Columns.Add("Sex");
15 dt.Columns.Add("Country");
16 dt.Columns.Add("Hobby");
17
18 //Default Data
19 dt.Rows.Add(new object[] { 1,"Mary","F","China","Cooking,Music"});
20 dt.Rows.Add(new object[] { 2, "John", "M", "China", "Tennis" });
21 }
22
23 if (countryDt == null)
24 {
25 countryDt=new DataTable();
26 countryDt.Columns.Add("cn");
27
28 //Default Data
29 countryDt.Rows.Add(new object[] { "China" });
30 countryDt.Rows.Add(new object[] { "French" });
31 countryDt.Rows.Add(new object[] { "America" });
32 countryDt.Rows.Add(new object[] { "Afria" });
33 countryDt.Rows.Add(new object[] { "Japan" });
34 }
35
36 if (hobbyDt == null)
37 {
38 hobbyDt = new DataTable();
39 hobbyDt.Columns.Add("hobby");
40
41 //Default Data
42 hobbyDt.Rows.Add(new object[] { "Cooking" });
43 hobbyDt.Rows.Add(new object[] { "Music" });
44 hobbyDt.Rows.Add(new object[] { "Reading" });
45 hobbyDt.Rows.Add(new object[] { "Movies" });
46 hobbyDt.Rows.Add(new object[] { "Tennis" });
47 }
48 }
49
50 public DataTable GetDt()
51 {
52 return dt;
53 }
54
55 public bool DelRecord(int id)
56 {
57 DataRow[] drs = dt.Select("ID=" + id);
58 bool result = false;
59 if (drs.Length == 1)
60 {
61 dt.Rows.Remove(drs[0]);
62 result = true;
63 }
64
65 return result;
66 }
67
68 public bool UpdateRecord(int id, string name, string country, string sex, string hobby)
69 {
70 DataRow[] drs = dt.Select("ID=" + id);
71 bool result = false;
72 if (drs.Length == 1)
73 {
74 drs[0]["Name"] = name;
75 drs[0]["Country"] = country;
76 drs[0]["Hobby"] = hobby;
77 drs[0]["Sex"] = sex;
78 result = true;
79 }
80
81 return result;
82 }
83
84 public bool AddRecord(string name, string country, string sex, string hobby)
85 {
86 DataRow[] drs = dt.Select();
87 Array.Sort<DataRow>(drs, new Comparison<DataRow>(SortHandler));
88 int newId = 1+Convert.ToInt32(drs[0]["ID"]);
89 dt.Rows.Add(new object[] {newId,name,sex,country,hobby });
90
91 return true;
92 }
93
94 private int SortHandler(DataRow arg1, DataRow arg2)
95 {
96 if (Convert.ToInt32(arg1["ID"]) == Convert.ToInt32(arg2["ID"]))
97 return 0;
98 else if (Convert.ToInt32(arg1["ID"]) < Convert.ToInt32(arg2["ID"]))
99 return 1;
100 else
101 return -1;
102 }
103
104 public DataTable GetCountry()
105 {
106 return countryDt;
107 }
108
109 public DataTable GetHobby()
110 {
111 return hobbyDt;
112 }
113 }
复制代码

这里没什么好说的,就是AddRecord方法中用到了Array.Sort方法,这个方法我用得很少,不过觉得挺好用的,定义一个方法作为第二个参数传入就可以了。

 

总结:

  不适用数据源控件的优点是,新增记录时可以马上看到新增的记录;缺点是即使实现了分页功能,但每次还是从数据库中读取全部数据,效率低。而使用ObejctDataSource来绑定就可以解决从数据库读取全部数据的问题,并且附带数据缓存(应用程序级缓存)的功能,省心多了。但却又因ObjectDataSource不支持重新绑定,而使新增记录时不能马上看到新增的记录的缺点。

  关于ObjectDataSource配合GridView的使用将在《GridView实战二:使用ObjectDataSource数据源控件》讲述。



 

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!


本文转自^_^肥仔John博客园博客,原文链接:http://www.cnblogs.com/fsjohnhuang/archive/2011/12/17/2290539.html,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

书名:《ASP.NET开发实战1200例》(清华大学出版社.房大伟.吕双) PDF格式扫描版,全书为23章,共935页。2011年1月出版。 全书压缩打包成3部,这是第2部 内容简介   《ASP.NET开发实战1200例》为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第I卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用ASP.NET进行程序开发的各种知识和技巧。主要包括ASP.NET技术基础、VS 2008环境搭建,还详细讲解了C#语言设计入门,然后从常用Web服务器控件、ASP.NET安全验证控件、数据绑定控件、Web用户控件和ASP.NET导航控件全面介绍了几乎所有ASP.NET控件应用,接着以AJAX无刷新技术及页面模板设计对ASP.NET客户端进行了详细介绍,最后以高效网站开发缓存技术、文件I/O处理和图形图像与多媒体方面更高层次地讲解了ASP.NET网站开发技术。本卷共6篇23章内容,共计600个实例经验技巧。每个实例都是作者精心筛选的,具有很强的实用性,其中一些是开发人员难于寻觅的。 目 录 第1篇 ASP.NET快速入门篇 第1章 搭建ASP.NET开发环境 2 1.1 ASP.NET环境配置 3 实例001 安装和配置Visual Studio 2008开发环境 3 实例002 安装和配置IIS(Web服务器) 7 实例003 安装MSDN帮助编程学习 10 实例004 在VS 2008中设定断点及调试程序 13 1.2 应用Web.Config配置网站 16 实例005 配置Access数据库连接 16 实例006 配置SQL Server数据库连接 18 实例007 配置Session变量的生命周期 19 实例008 限制上传文件的大小与时间 20 实例009 连接默认错误页 21 实例010 配置验证级别 22 第2章 C#语言基础 25 2.1 实用的数据类型 26 实例011 仓库与盒子的学问——数据类型与变量 26 实例012 数据类型之值类型的使用 27 实例013 数据类型之引用类型的使用 30 实例014 数据类型之浅复制:包含引用类型的值类型 31 实例015 按值传递引用类型 33 实例016 按引用传递引用类型 35 实例017 程序性能的优化——装箱和拆箱的 最小化 36 2.2 流程控制和数组的应用 38 实例018 岔路口的选择——这是去医院还是去学校的路 38 实例019 看看你现在是否处于人生的黄金阶段 40 实例020 当前所处月份是地球上的春夏秋冬哪个季节 41 实例021 巧妇的“精打细算”——百钱买百鸡 43 实例022 后台管理登录窗口中用户名及密码的重置 45 实例023 制作一个简单的循环计数器 47 实例024 媳妇儿喜欢的“大乐透”号码 48 实例025 我的“双色球”从小到大的排序号码 50 实例026 明日科技编程全能词典种类及其价格 51 实例027 浓浓思乡之情——李白的《静夜思》 53 实例028 会考考试中的汉字拼音简码 54 实例029 经典算法之歌德巴赫猜想的算法 55 实例030 经典问题之约瑟夫环问题(使用数组解决) 57 实例031 数组与算法之冒泡排序 58 实例032 冒泡排序的改进——快速排序算法 60 实例033 较高级的数组与算法——二法搜索 61 2.3 运算符的应用 63 实例034 加加减减——前缀方式增1和减1运算符 63 实例035 乾坤大挪移——移位运算符的简单应用 64 实例036 制作一个简单的加法计算器(利用算术运算符) 66 实例037 判断合法的用户名称和密码 67 实例038 加密用户密码等重要的数据信息 69 2.4 静态字符串String操作 70 实例039 用户注册中“密码”和“确认密码”是否一致 70 实例040 定位字符串和子串 71 实例041 标准的图书定价及上市时间 72 实例042 由用户名“MR”和密码“明日科技”组成新密码 73 实例043 行显示我的兴趣与爱好 75 实例044 两种比较不错的密码修改方案 76 实例045 再谈两种比较不错的密码修改方案 77 实例046 智能复制当前输入的数据信息 79 实例047 用户密码重置功能 80 2.5 动态字符串StringBuilder操作 81 实例048 动态追加用户密码信息 81 实例049 客户管理系统中动态组成用户新密码 82 实例050 用户密码设置简单化 83 实例051 动态替换用户密码信息 84 2.6 常用日期操作 85 实例052 获得
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
限时福利限时福利,15000+程序员的选择! 购课后添加学习助手(微信号:csdn590),按提示消息领取编程大礼包!并获取讲师答疑服务! 套餐中一共包含5门程序员必学的数学课程(共47讲) 课程1:《零基础入门微积》 课程2:《数理统计与概率论》 课程3:《代码学习线性代数》 课程4:《数据处理的最优化》 课程5:《马尔可夫随机过程》 哪些人适合学习这门课程? 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些: ①价值300元编程课程大礼包 ②应用数学优化代码的实操方法 ③数学理论在编程实战中的应用 ④程序员必学的5大数学知识 ⑤人工智能领域必修数学课 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。 如何听课? 1、登录CSDN学院 APP 在我的课程中进行学习; 2、登录CSDN学院官网。 购课后如何领取免费赠送的编程大礼包和加入答疑群? 购课后,添加助教微信: csdn590,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流!
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页