• 每日学习总结: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"
                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>");
            }
    
  • 相关阅读:
    Idea启动多服务时的Dashboard展示
    通过maven动态配置spring boot配置文件
    辅域抢夺五大角色命令
    H3C交换机堆叠技术
    KMS激活专用:所有Windows版本的GVLK密钥对照表
    Windows Server 2012从Evaluation版转成正式版
    u盘装系统无法引导
    [调优]彻底解决RDP连接过程缓慢的问题
    [排错]无法初始化 vGPU“grid_p40-1q”的插件“/usr/lib64/vmware/plugin/libnvidia-vgx.so”
    Virtual Apps and Desktops 7 1912 LTSR集成DB迁移到SQL Server 2016 AlwaysOn生产环境
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3112926.html
Copyright © 2020-2023  润新知