动态改变gridview列宽度函数分享

 更新时间:2014年01月13日 14:07:06   投稿:zxhpj  
通常用GridView绑定datatable,由于需要动态绑定到不同的datatable所以需要动态调整GridView的宽度。写了这个函数实现该功能

我通常用GridView绑定datatable,由于需要动态绑定到不同的datatable所以需要动态调整GridView的宽度。所以写了这个函数实现该功能。GridView的宽度需要根据各个列中最大宽度来累加获得。在求各个列的最大字符宽度的时候需要对中文和英文加以区分,因为字符串“序号”和“id”的length属性都为2,但是显示的时候一个汉字占据的宽度却相当于2个英文字符。要想达到准确的显示效果,我对含有汉字的字符串根据汉字的数目确定该字符串等价英文字符的长度,例如字符串“序号id”的length属性为4,我自己通过函数获得的长度为6.确定了每列的最大字符数后,累加即可获得GridView的宽度字符,然后乘于一个字符在屏幕上的显示宽度oneLetterLength常量后就是GridView宽度。

复制代码 代码如下:

public  void SetGridViewWidth(GridView gridview1)
        {
            int rowcount = gridview1.Rows.Count;   //行数
            int colcount = gridview1.Columns.Count;  //列数
            int i=0,j=0;
            int[] cellwidth = new int[colcount];   //数组用来存储各个列的最大字符数
            int gridviewwidth = 0;  //GridView宽度
            Unit width = 0; 
            string temp = null;
            int tempLength = 0;

            for (i = 0; i < rowcount; i++)     //循环数据项,获得各个列的最大字符宽度
            {
                for (j = 0; j < colcount; j++)
                {
                    temp = gridview1.Rows[i].Cells[j].Text;
                    tempLength = LengthOfLetter(temp);      //LengthOfLetter()返回含中文的字符串字符宽度,1个汉字2个字符宽
                    if (cellwidth[j] < tempLength)
                    {
                        cellwidth[j] = tempLength;        //存储较大宽度值
                    }

                }
            }

          

            for (j = 0; j < colcount; j++)
            {
                if (gridview1.HeaderRow.Visible == true)      //如果GridView表头可见,将表头列宽参与比较                {
                    temp = gridview1.HeaderRow.Cells[j].Text;
                    tempLength = LengthOfLetter(temp);
                    if (cellwidth[j] < tempLength)
                    {
                        cellwidth[j] = tempLength;
                    }
                }

                if (gridview1.FooterRow.Visible == true)    //如果GridView表尾可见,将表尾列宽参与比较                {
                    temp = gridview1.FooterRow.Cells[j].Text;
                    tempLength = LengthOfLetter(temp);
                    if (cellwidth[j] < tempLength)
                    {
                        cellwidth[j] = tempLength;
                    }
                }

            }


            for (j = 0; j < colcount; j++)
            {
                if (gridview1.Columns[j].Visible == true)     //将显示的列的各列最大字符宽度相加                {
                    gridviewwidth += cellwidth[j];
                }
            }

            width = gridviewwidth * oneLetterLength;  //GridView最大字符数乘于一个字符显示宽度得到GridView显示宽度
            if (gridview1.Width.Value < width.Value)    //如果在界面上已经设置了GridView的宽度,将动态求的宽度和页面上的
               {                                                              //初始化宽度比较,如果初始化宽度较小则将宽度设置为新调整的宽度。
                     gridview1.Width = width;
                }

        }

       //含有中文的字符串等效英文字符串显示长度

        public  int LengthOfLetter(string temp) 
        {
            int length = temp.Length;
            int newlength = temp.Length;

            for (int i = 0; i < length; i++)         //遍历字符串每个字符
            {
                if (IsChineseLetter(temp, i))     //IsChineseLetter()判断是否为中文字符,是则宽度加1
                {
                    newlength++;
                }
            }
            return newlength;

        }


   //判断是否为中文字符
     public  bool  IsChineseLetter(string input,int index)
        {
            int code = 0;
            int chfrom = Convert.ToInt32("4e00", 16);    //范围(0x4e00~0x9fff)转换成int(chfrom~chend)
            int chend = Convert.ToInt32("9fff", 16);
            if (input != "")
            {
                code = Char.ConvertToUtf32(input, index);    //获得字符串input中指定索引index处字符unicode编码
               
               if (code >= chfrom && code <= chend)    
               {
                    return true;     //当code在中文范围内返回true

                }
               else
               {
                     return false ;    //当code不在中文范围内返回false
               }
            }

            return false;
        }

相关文章

  • C#组件FormDragger窗体拖拽器详解

    C#组件FormDragger窗体拖拽器详解

    这篇文章主要为大家详细介绍了C#组件FormDragger窗体拖拽器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • C#实现Word文档转Markdown格式的示例代码

    C#实现Word文档转Markdown格式的示例代码

    文档格式的多样性丰富了我们的信息交流手段,其中Word文档因其强大的功能性而广受欢迎,Markdown因其简洁、易于阅读和编辑的特性而展现出独特的优势,本文将介绍如何在.NET平台使用C#代码实现Word文档到Markdown格式的转换,需要的朋友可以参考下
    2024-04-04
  • c#结构和类的相关介绍

    c#结构和类的相关介绍

    结构和类的共同点都是属于抽象数据类型,包含数据和数据的操作。不同点在于结构偏重于数据语意,而类偏重於行为语意。
    2012-12-12
  • 几分钟搞懂c#之FileStream对象读写大文件(推荐)

    几分钟搞懂c#之FileStream对象读写大文件(推荐)

    这篇文章主要介绍了c#之FileStream对象读写大文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • C#实现一个相当全面的数据转换工具类

    C#实现一个相当全面的数据转换工具类

    这篇文章主要为大家介绍了如何使用C#编写一个通用工具类DataConvert来进行数据转换,包括30+个数据类型转换,需要的可以了解一下
    2025-03-03
  • C#使用读写锁解决多线程并发问题

    C#使用读写锁解决多线程并发问题

    本文详细讲解了C#使用读写锁解决多线程并发问题,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#基本语法简介

    C#基本语法简介

    本文详细讲解了C#的基本语法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C#实现常见加密算法的示例代码

    C#实现常见加密算法的示例代码

    这篇文章主要为大家详细介绍一下C#中一些常见加密算法(Base64编码、凯撒密码、Vigenere密码、DES、AES)以及它们的实现代码,感兴趣的可以了解一下
    2022-07-07
  • C#如何修改项目名图文详解

    C#如何修改项目名图文详解

    最近开发工作接近尾声,客户来要求更换项目的名称,差不多要变更整个解决方案中项目名称,引用等等,这个工作量还是很大的,这篇文章主要给大家介绍了关于C#如何修改项目名的相关资料,需要的朋友可以参考下
    2023-01-01
  • C# 语言入门基础介绍

    C# 语言入门基础介绍

    这篇文章主要介绍了C# 语言入门基础,c#是一种新式编程语言,不仅面向对象,还类型安全,本教程概述了 C# 8 及更高版本中该语言的主要组件。 下面一起进入文章了解更多的详细内容吧
    2021-12-12

最新评论