每日学习总结:DataTable按某一列数值大小排序问题、GridView后台动态绑定、页面导航方法总结
Posted on 2013-06-01 18:07 星星之火116 阅读(2357) 评论(0) 编辑 收藏 举报2013-5-31
1. DataTable中按某一列的值的大小排序问题
上周在开发中遇到这样的一个问题,就是对DataTable中的某一列按照值的大小排序。因为该DataTable是用其他的DataTable重新拼接构造而来的,所以需要再次排序。所以很自然的就用到了DataView.Sort属性。代码如下:
DataView dv=dt.DefaultView; dv.sort=”列名 desc”; dt=dv.ToDataTable(); |
以上的这些代码本身是没有问题的,但是在构造新的DataTable的时候,是用现有的DataTable oldDt的某些列来构造的,如下:
DataTable dt= new DataTable(); dt.Columns.add( new Column(“列名”,oldDt.Columns[“oldColumn”].getType()); |
所以在使用DataView.Sort排序之后出来的结果并没有像预期的那样,按数值的大小,由大到小排列,而是按如下的排列:
1 10 121 2 30 4 |
如何解决这样的问题呢?事实上只要将要排序的列的类型设置为int型即可,或许你从数据库读取的数据类型就是int的型的,但是在构造新的DataTable时还需要再重新声明定义。
具体操作如下:
DataTable dt= new DataTable(); dt.Columns.add( new Column(“列名”,Type.GetType(“System.Int32”)); |
然后再用DataView.Sort属性进行排序就可以实现按某一列的值的大小排序了。
2. GridView后台动态绑定
有些时候在对GridView进行绑定的时候,需要进行定制绑定,即绑定个别的列,但是又不知道具体的列名,这个时候就需要用到动态绑定了。下面就给大家介绍一个如何在后头进行动态绑定。
新建GridViewAutoBinding.aspx页,
前台代码如下:
<div> <asp:GridView ID= "Auto_Binding_GridView" runat= "server" AutoGenerateColumns= "false" > </asp:GridView> </div> |
只是在DIV里嵌套了一个GridView控件,这里需要特别注意的是要将GridView的AutoGenerateColumns 设置为false,这样就可以控制具体显示那些列,如果不设置的话,默认的会显示数据源中的所有列。
后台代码如下:
/// <summary> /// 页面加载,调用GridViewDataBing()方法进行绑定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load( object sender, EventArgs e) { GridViewDataBing(); } /// <summary> /// 获取数据源,并动态的对GridView进行绑定 /// </summary> protected void GridViewDataBing() { #region 读取数据库,获取数据源 SqlParameter[] parms= new SqlParameter[1]{ new SqlParameter( "@query" ,SqlDbType.NVarChar,1000){ Value= "" }}; DataTable dt = DBHelper.GetDataTable( "dbo.get_latesd_log_info" , parms); #endregion #region 对GridView进行动态绑定 Auto_Binding_GridView.DataSource = dt.DefaultView; //为DataGridView设置数据源 Auto_Binding_GridView.Columns.Clear(); //移除所有的列项,动态绑定 var link = new HyperLinkField() { DataTextField = dt.Columns[0].ToString(), HeaderText = dt.Columns[0].ToString(), <br>DataNavigateUrlFields = new string [] { dt.Columns[0].ToString(), dt.Columns[1].ToString() }, <br>DataNavigateUrlFormatString= "/2013-5-31/GridViewDetails.aspx?Name={0}&Date={1}" }; //产生一个类似超链接的列,并绑定要导航到的页的url即queryString参数 Auto_Binding_GridView.Columns.Add(link); //将该列添加到GridView列集合中 for ( int i = 1; i < dt.Columns.Count; i++) //遍历数据源中剩下的列,生成BoundField列并绑定到GridView的列集合中 { BoundField bf = new BoundField() { DataField = dt.Columns[i].ToString(), HeaderText = dt.Columns[i].ToString() }; Auto_Binding_GridView.Columns.Add(bf); } Auto_Binding_GridView.DataBind(); //GridView数据绑定 #endregion } |
结果如下:
GridView后台动态绑定效果图
HyperLinkField列导航到另一个页面效果图:
我们在前台进行绑定GridView时,会有许多的模板,在上边的例子中使用了两个模板,即:BoundField和HyperLinkField.BoundField模板的显示效果就是一般的内容展示,而HyperLinkField显示效果则类似于超链接,它有几个属性需要特别的注意:
HeaderText:即要显示表格的标题,这里用dt.Columns[0].ToString()
DataTextField:即要绑定的数据项,dt.Column[0].ToString()
DataNavigateUrlFields:即QueryString中要绑定的字段,该属性的值是一个字符串数组,这里用DataTable的第一列和第二列作QueryString中要传递的字段,new string[] { dt.Columns[0].ToString(), dt.Columns[1].ToString() }
DataNavigateUrlFormatString:即要导航到明细页(另一个页面)的Url,包括QueryString,如下:"/2013-5-31/GridViewDetails.aspx?Name={0}&Date={1}" }
除此之外,还有其他的模板,比如:CommandField模块,这个模板可以用来执行命令操作
如下:
CommandField cf = new CommandField() { ButtonType = ButtonType.Link, EditText = "编辑" , ShowEditButton = true }; Auto_Binding_GridView.Columns.Add(cf); |
这个时候还需要为GridView设置相应的RowEditing事件,前台代码如下:
<div> <asp:GridView ID= "Auto_Binding_GridView" runat= "server" AutoGenerateColumns= "false" onrowediting= "Auto_Binding_GridView_RowEditing" > </asp:GridView> </div> |
通过在设计视图里点击GridView的属性,然后点击事件设置符号(雷电符号),找到RowEditting事件双击皆可,完成该操作后,会在后太产生一个RowEditting事件如下:
protected void Auto_Binding_GridView_RowEditing( object sender, GridViewEditEventArgs e) { Auto_Binding_GridView.EditIndex = e.NewEditIndex; } |
通过e的NewEditIndex属性获取当前编辑行的Index即可进行编辑。
效果图如下:
添加CommandField之后的效果图
3. 导航的另一个页的方法总结
页面代码如下:
<div id= "main" > <table> <tr><th>如何导航到其他页面</th></tr> <tr> <td> <asp:Button ID= "Redirect" runat= "server" Text= "Response.Redirect" onclick= "btn1_Click" /></td> <td> 可以导航到任何的页面,但是需要进行两次“握手”,速度比较慢,可以传递参数 </td> </tr> <tr> <td> <asp:Button ID= "btn3" runat= "server" Text= "Server.Transfer" onclick= "btn3_Click" /> </td> <td> 只能导航到站内的站点,不能跨站导航,只需执行一次握手即可,速度最快 </td> </tr> <tr><td> <asp:HyperLink ID= "HyperLink1" runat= "server" NavigateUrl= "~/2013-5-31/AnotherPage.aspx" >HyperLinK</asp:HyperLink></td> <td>服务器端导航控件,只能进行站内导航</td> </tr> <tr> <td> <asp:LinkButton ID= "LinkButton1" runat= "server" PostBackUrl= "~/2013-5-31/AnotherPage.aspx" >LinkButton</asp:LinkButton> </td> <td>服务器端控件,只能进行站内导航</td> </tr> <tr> <td> <asp:Button ID= "btn4" runat= "server" Text= "Window.Location.Href" onclick= "btn4_Click" /> </td> <td>和Window.Open的效果一样,区别在于前者不会打开一个新的页面,仅仅是导航</td> </tr> <tr> <td> <asp:Button ID= "Open" runat= "server" Text= "Window.Open" onclick= "Transfer_Click" /></td> <td> 打开了一个新的页面,在url里也可以传递参数, </td> </tr> </table> </div> |
Asp.net导航到其他页面的方法汇总图
后台代码:
protected void btn1_Click( object sender, EventArgs e) { Response.Redirect( "/2013-5-31/AnotherPage.aspx" ); } protected void Transfer_Click( object sender, EventArgs e) { Response.Write( "<script language='javascript'>window.open('/2013-5-31/AnotherPage.aspx')</script>" ); } protected void btn3_Click( object sender, EventArgs e) { Page.Server.Transfer( "/2013-5-31/AnotherPage.aspx" ); } protected void btn4_Click( object sender, EventArgs e) { Response.Write( "<script language='javascript'>window.location.href='/2013-5-31/AnotherPage.aspx'</script>" ); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构