例如GridView绑定了三列,这个数据是动态绑定,自动生成绑定列,请问要怎么判断每列的类型,如果是数字类型就统一靠右,如果是字符串靠左,如果是特定的格式,如日期,那就居中,请问如何实现?
这个功能有几个难点:
1.列是动态绑定的,很难获取到列
2.怎么判断这列是什么类型,有可能第一列是数字,第二列是字符串?
名字    月薪      时间
张一    2000      2010-4-22
李三    2100      2010-4-22
兆光    1800      2010-4-22

解决方案 »

  1.   

        
    //增加RowDataBound事件
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            GridViewRow row = e.Row;
            if (row.RowType == DataControlRowType.DataRow)
            {
                //能确定列的位置吗?,哪列是数字、字符串、日期
                row.Cells[0].HorizontalAlign = HorizontalAlign.Right;
                row.Cells[1].HorizontalAlign = HorizontalAlign.Left;
                row.Cells[2].HorizontalAlign = HorizontalAlign.Center;            //不能确定的话
                for (int i = 0; i < row.Cells.Count; i++)
                {
                    //判断row.Cells[i].Text是数字、字符串、日期,判断的方法自己写
                    //修改HorizontalAlign
                }
            }
        }
      

  2.   


    你好,我的想法和你的有点区别,你的事件是循环行,其实我只要判断列类型就好了
    因为我的列是自动生成的,就是说直接判断DataTable每列的类型就好了,可以解决数字和字符串,但是没办法解决特定格式的数据列,例如:日期,因为我把日期取出来的时候,为了限定统一格式Convert(Nvarchar(10),Getdate(),120) ,所以得到的结果就变成字符串了,如果不转的话,格式无法统一,请大家帮我想想办法private void OverrideGridViewStyle()
        {
            DataTable dt = DeserializeXmlFileDataTable("Sys_user");
            foreach (DataColumn dc in dt.Columns)
            {
                Type t = dc.DataType;
            }
        }
      

  3.   

    这个貌似不用判断吧,这么麻烦,你本身就知道数据库表结构啦,也就是知道绑定到gridview中的哪列属于哪种类型了,除非你是自动绑定列的
      

  4.   

    现在的难点变成GridView自动生成列,怎么才能获取到?
      

  5.   

    取出来,绑定的时候,格式化也可以啊{0:yyyy-MM-dd}
      

  6.   


    现在的难点变成GridView自动生成列,怎么才能获取到?在Columns集合内没有,请问怎么处理?
      

  7.   

    1.你都把日期转化成字符串了,就没办法判断了,只有通过RowDataBound事件根据值来循环判断,这个是比较麻烦。这个就参考2楼的
    2.你不要在后台数据库中做任何类型处理,处理放在.net这里,比如说DateTime你可以通过格式化得到你想样的格式
      

  8.   

    顺序一样有什么用?顺序又会产生什么?你说的我没明白
    我的意思很简单,我通过代码去循环GridView列集合,但是自动生成列是不会在GridView列集合里的,不知道你明白我的意思了没?
      

  9.   

    不明白怎么会得不到列既然DataGridView中已经显示出来肯定是可以得到的,代码贴出来你是怎么绑定的。
      

  10.   

    你可能没有遇到这样的问题,你不相信可以去试一下,自动生成列,不会在列集合里,下面是一个网址,你可以去看一下http://www.skinplusplus.com/bbs/thread-29122-1-1.html
      

  11.   

    AutoGenerateColumns="true"
    是按照sql语句,如果是*,就按照数据库表的字段顺序排。
    如果是自己写的几个字段,就按写的排。这样怎么会不知道哪个字段的顺序?
      

  12.   

    这三张图片,大家可以看一下以下几点:
    1.在监视里看gv_TestDataBind.Columns的Count
    2.页面最后呈现出来的是多少列,因为第一列是模板列,固定的,所以取得到,自动生成列就取不到
      

  13.   


    private void OverrideGridViewStyle()
        {
            DataTable dt = DeserializeXmlFileDataTable("Sys_user");
            foreach (DataColumn dc in dt.Columns)
            {
                foreach (DataControlField dcf in gv_TestDataBind.Columns)
                {
                    if (dcf.HeaderText.Trim() == dc.ColumnName.Trim())
                    {
                        switch (dc.DataType.ToString().Trim())
                        {
                            case "System.Int32":
                                {
                                    dcf.ItemStyle.HorizontalAlign = HorizontalAlign.Right;
                                    break;
                                }
                            case "System.String":
                                {
                                    dcf.ItemStyle.HorizontalAlign = HorizontalAlign.Left;
                                    break; 
                                }
                        }
                    }
                }
            }
        }
      

  14.   

    http://www.itqun.net/content-detail/112468.html 我发的网址都是处理有关于自动生成列的,无法获取,希望大家有没有好的建议?
      

  15.   

    自己绑定的列的时候,估计只能分析datatable来设定格式了
      

  16.   

    我现在要获取GridView自动生成的列,只要列取到了,其他都好办,请大家帮我想想有没有实现办法?
      

  17.   


    <asp:GridView ID="GridView1" runat="server" Width="600px" OnRowDataBound="GridView1_RowDataBound" AutoGenerateColumns="True" DataSourceID="ObjectDataSource1">
    </asp:GridView>    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            GridViewRow row = e.Row;
            if (row.RowType == DataControlRowType.DataRow)
            {
                //能确定列的位置吗?,哪列是数字、字符串、日期
                 row.Cells[0].HorizontalAlign = HorizontalAlign.Right;
                row.Cells[1].HorizontalAlign = HorizontalAlign.Left;
                row.Cells[2].HorizontalAlign = HorizontalAlign.Center;
            }
        }
    你是否知道数据库,字段的顺序。我刚才也试验了,这样是可以设置的。
      

  18.   

    确定列的位置:
    1.先判断gridview列名==DataTable列名,然后在取DataTable当前列的类型,再判断是int,还是string选择靠左还是右
    我的代码
    protected void gv_TestDataBind_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if(e.Row.RowType == DataControlRowType.Header)
            {
                DataTable dt = DeserializeXmlFileDataTable("Sys_user");
                foreach (TableCell tc in e.Row.Cells)
                {
                    foreach (DataColumn dc in dt.Columns)
                    {
                        if (tc.Text.Trim() == dc.ColumnName.Trim())
                        {
                            switch (dc.DataType.ToString().Trim())
                            {
                                case "System.Int32":
                                    {
                                        tc.HorizontalAlign = HorizontalAlign.Right;
                                        break;
                                    }
                                case "System.String":
                                    {
                                        tc.HorizontalAlign = HorizontalAlign.Left;
                                        break;
                                    }
                            }
                        }
                    }
                }
            }
        }如果是按照这样的写法,那就有个新问题,在RowType==DataRow的范围内,怎么取到Header的值
      

  19.   

    其实你的程序可以在页面第一次访问时(!IsPostback),去访问数据源,然后调用GridView的Columns.Add方法增加你所生成的列——包括模板列。而设置GridView的AutoGenerateColumns为false。