每日学习总结:DataTable按某一列数值大小排序问题、GridView后台动态绑定、页面导航方法总结

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(), 
DataNavigateUrlFields = new string[] { dt.Columns[0].ToString(), dt.Columns[1].ToString() }, 
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"
            οnclick="btn1_Click" /></td>
    <td>
        可以导航到任何的页面,但是需要进行两次“握手”,速度比较慢,可以传递参数
    </td>
    </tr>
    <tr>
    <td>
        <asp:Button ID="btn3" runat="server" Text="Server.Transfer"
            οnclick="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"
            οnclick="btn4_Click" />
    </td>
    <td>和Window.Open的效果一样,区别在于前者不会打开一个新的页面,仅仅是导航</td>
    </tr>
    <tr>
    <td>
        <asp:Button ID="Open" runat="server" Text="Window.Open"
            οnclick="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>");
        }

  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DataGridView控件用法合集 1. DataGridView当前的单元格属性取得、变更 2. DataGridView编辑属性 3. DataGridView最下面一列新追加行非表示 4. DataGridView判断当前选中行是否为新追加的行 5. DataGridView删除行可否设定 6. DataGridView不表示和删除 7. DataGridView宽度高度设置为不能编辑 8. DataGridView行高幅自动调整 9. DataGridView指定行冻结 10. DataGridView顺序变更可否设定 11. DataGridView行复数选择 12. DataGridView选择的行、、单元格取得 13. DataGridView指定单元格是否表示 14. DataGridView表头部单元格取得 15. DataGridView表头部单元格文字设定 16. DataGridView选择的部分拷贝至剪贴板 17. DataGridView粘贴 18. DataGridView单元格上ToolTip表示设定(鼠标移动到相应单元格上时,弹出说明信息) 19. DataGridView中的ContextMenuStrip属性 20. DataGridView指定滚动框位置 21. DataGridView手动追加 22. DataGridView全体分界线样式设置 23. DataGridView根据单元格属性更改显示内容 24. DataGridView新追加行的行高样式设置る 25. DataGridView新追加行单元格默认设置 26. DataGridView单元格数据错误标签表示 27. DataGridView单元格内输入正确性判断 28. DataGridView单元格输入错误事件的捕获 29. DataGridView排序(点击表头自动排序的设置) 30. DataGridView自动行排序(新追加也会自动排序) 31. DataGridView自动行排序禁止情况下的排序 32. DataGridView指定指定排序 33. DataGridView单元格样式设置 34. DataGridView文字表示位置的设定 35. DataGridView单元格内文字换行 36. DataGridView单元格DBNull表示的设定 37. DataGridView单元格样式格式化 38. DataGridView指定单元格颜色设定 39. DataGridView单元格文字字体设置 40. DataGridView根据单元格设定单元格样式 41. DataGridView设置单元格背景颜色 42. DataGridView行样式描画 43. DataGridView显示行号 44. DataGridView焦点所在单元格焦点框不显示的设定 45. DataGridView中显示选择框CheckBox 46. DataGridView中显示下拉框ComboBox 47. DataGridView单击打开下拉框 48. DataGridView中显示按钮 49. DataGridView中显示链接 50. DataGridView中显示图像 51. DataGridView编辑中单元格控件取得 52. DataGridView输入自动完成 53. DataGridView单元格编辑时键盘KEY事件取得 54. DataGridView下拉框(ComboBox)单元格编辑时事件取得 55. DataGridView下拉框(ComboBox)单元格允许文字输入设定 56. DataGridView根据不同在另一列中显示相应图片 57. DataGridView中显示进度条(ProgressBar) 58. DataGridView中添加MaskedTextBox 59. DataGridView中Enter键按下焦点移至旁边的单元格 60. DataGridView行集合化(Group)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值