zoukankan      html  css  js  c++  java
  • DataGrid列宽随着内容自动变化

     

       //自动调整DataGrid列宽
        public static void AutoSizeGrid(DataGrid dataGrid)
        {              colStyle.MappingN
            DataGridTableStyle tableStyle = new DataGridTableStyle();          
            System.Windows.Forms.DataGridTextBoxColumn
    colStyle;
            DataTable dt = (DataTable)dataGrid.DataSource;     
           
            //循环列
            for(int col=0; col<dt.Columns.Count; col++)
            {
                float width = 0;
                Graphics g = Graphics.FromHwnd(dataGrid.Handle);
                StringFormat sf = new StringFormat(StringFormat.GenericTypographic);
                SizeF size = new SizeF();
                //循环行,得到最大宽度
                for(int row=0; row<dt.Rows.Count; row++)
                {
                    size = g.MeasureString(dataGrid[row,col].ToString(),dataGrid.Font,500,sf);
                    if(size.Width > width)
                        width = size.Width;
                }
                g.Dispose();
               
                if(width < dataGrid.PreferredColumnWidth)
                    width = dataGrid.PreferredColumnWidth;

                if(dataGrid.TableStyles.Count > 0)
                    dataGrid.TableStyles[0].GridColumnStyles[col].Width = (int)width + 10;
                else
                {                  
                    colStyle = new DataGridTextBoxColumn();
       ame = dt.Columns[col].Caption;
                    colStyle.HeaderText = dt.Columns[col].Caption;
                    colStyle.Width = (int)width + 10;
                    tableStyle.GridColumnStyles.Add(colStyle);
                }  
            }
            if(dataGrid.TableStyles.Count == 0)
            {
                tableStyle.RowHeadersVisible = false;
                dataGrid.TableStyles.Add(tableStyle);
            }
        }

     

     

    http://blog.csdn.net/dotnetlife/archive/2007/11/20/1895280.aspx

    在使用vs2005时进行wince开发时,用Datagrid控件显示表格数据,当表格内容过多时,Datagrid控件单元格宽度并不足以用来完全显示表格中的数据内容,,只有自己每次去拉动分界线,来进行调整。当出现表格字段比较多时,这样做就显得很麻烦。

    PDA本身屏幕就很小,即使只显示3-5列,拖动依旧很烦人,因此就有了实现自动调整列宽功能的想法。

    首先到网上搜了一下,只发现一个PC机用的,vb.net源码的(出处不明),如下:

    先定义一个Sub过程AutoSizeCol,用来调整Datagrid中的列宽。
    如下:
    Public Sub AutoSizeCol(ByVal col As Integer)
    Dim width As Single
    width = 0
    Dim numRows As Integer
    numRows = CType(dataGrid1.DataSource, DataTable).Rows.Count
    Dim g As Graphics
    g = Graphics.FromHwnd(dataGrid1.Handle)
    Dim sf As StringFormat
    sf = New StringFormat(StringFormat.GenericTypographic)
    Dim size As SizeF
    Dim i As Integer
    i = 0

    Do While (i < numRows)
    size = g.MeasureString(dataGrid1(i, col).ToString, dataGrid1.Font, 500, sf)
    If (size.Width > width) Then
    width = size.Width
    End If
    i = (i + 1)
    Loop

    g.Dispose()
    dataGrid1.TableStyles("customers").GridColumnStyles(col).Width = CType(width, Integer)

    End Sub

    现在就可以表格内容来定义整张表所有列的宽度了。如下:
    Public Sub AutoSizeTable()
    Dim numCols As Integer
    numCols = CType(dataGrid1.DataSource, DataTable).Columns.Count
    Dim i As Integer
    i = 0
    Do While (i < numCols)
    AutoSizeCol(i)
    i = (i + 1)
    Loop
    End Sub

    只要使用以上两个Sub过程就可以达到你想要的结果了!

     

     

    我打算做了一下改造,想改成c#并放到wince下运行,结果发现Graphics.FromHwnd(dataGrid1.Handle)这句就报错了,而且g.MeasureString(dataGrid1(i, col).ToString, dataGrid1.Font, 500, sf)方法在cf中支持的也不好,既然net提供的方法不好用,那就自己来做,思路如下:通过遍历根据内容更改列宽,首先获取单元格中存放的字符串,用字符串的长度乘以每个字符占据的象素数,得到结果后设置成列宽。同时考虑到中文字符和英文(数字)的字符串占据象素不同,因此先将字符串转成字节再计算。


    解决问题,代码如下:

     public  void AutoSizeTable(DataGrid dgData)
            {
                int numCols = dgData.TableStyles[0].GridColumnStyles.Count;
                for (int i = 0; i < numCols; i++)
                {
                    AutoSizeCol(dgData,i);
                }
            }

            private static void AutoSizeCol(DataGrid dgData, int colIndex)
            {
               
                int rowNums = ((DataTable)dgData.DataSource).Rows.Count;
                Byte[] myByte = System.Text.Encoding.Default.GetBytes(dgData.TableStyles["ROW"].GridColumnStyles

    [colIndex].HeaderText);
                int textCount = myByte.Length;
                int tempCount = 0;
                    
                for (int i = 0; i < rowNums; i++)
                {
                  
                    if (dgData[i, colIndex] != null)
                    {
                        myByte = System.Text.Encoding.Default.GetBytes(dgData[i, colIndex].ToString().Trim());
                        tempCount = myByte.Length;

                        if (tempCount > textCount)
                        {
                            textCount = tempCount;
                        }
                    }
                }
                dgData.TableStyles[0].GridColumnStyles[colIndex].Width = textCount * 7;
              
            }


    在wince下测试,宋体10号字,乘7效果不错。

    优点:原理简单,实现也不难,并且通用性比较好。
    缺点:因为是遍历,速度和性能会低一点,会出现滚动条,个人觉得比让用户拖动列分界线要好的多。 

  • 相关阅读:
    修改requests_html.AsyncHTMLSessions使得支持url参数
    MyBatis查询返回Map示例代码
    java.util.ConcurrentModificationException 异常原因和解决方法
    Springboot整合RabbitMQ(四)——设置消息过期时间TTL
    MySql Lock wait timeout exceeded该如何处理? (转载)
    对开发流程优化的建议
    容器未正常启动-->docker ps看不到,docker ps -a可以看到-->执行命令时出现Container is not running
    Linux下C语言多线程编程
    curl库相关使用
    PCB走线&过孔载流分析
  • 原文地址:https://www.cnblogs.com/godwar/p/1134717.html
Copyright © 2011-2022 走看看