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

 更新时间:2014年01月13日 14:07:06   作者:  
通常用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# COM组件原理详解

    c# COM组件原理详解

    本文主要介绍了c# COM组件原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • C#连接Mysql数据库详细教程(内附Mysql及Navicat)

    C#连接Mysql数据库详细教程(内附Mysql及Navicat)

    这篇文章主要给大家介绍了C#连接Mysql数据库详细教程(内附Mysql及Navicat),文中通过代码示例和图文介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-10-10
  • 详解C#中的string与String

    详解C#中的string与String

    本篇文章主要对jC#中的小写string与大写String进行详细介绍,相信对大家学习会有很好的帮助,需要的朋友一起来看下吧
    2016-12-12
  • C#索引器简单实例代码

    C#索引器简单实例代码

    打开.Net Framework源代码随便看几个类,就会发现索引器的影子。索引器可以被重载,可以接收一个或者多个参数,但是不可以定义为静态的。可以用关联数组的方式访问索引器。
    2013-03-03
  • C#实现统计字数功能的方法

    C#实现统计字数功能的方法

    这篇文章主要介绍了C#实现统计字数功能的方法,较为详细的分析了C#字数统计功能的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 将Qt项目升级到Qt6吐血经验总结

    将Qt项目升级到Qt6吐血经验总结

    很多朋友向小编反馈将Qt项目升级到Qt6频繁出错,该如何处理呢,今天小编给大家带来了将Qt项目升级到Qt6吐血经验总结,感兴趣的朋友一起看看吧
    2021-07-07
  • c#配置文件中自定义块节点的方法

    c#配置文件中自定义块节点的方法

    在.netcore中我们非常方便获取配置文件节点参数,但是在非.netcore下一般 我们是使用中方法,本文我们将给大家详细介绍c#配置文件中自定义块节点的方法,文中有详细的代码示例供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10
  • C#如何打开选择文件对话框和选择目录对话框

    C#如何打开选择文件对话框和选择目录对话框

    这篇文章主要介绍了C#如何打开选择文件对话框和选择目录对话框问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 你是不是这样写异常处理代码的呢?

    你是不是这样写异常处理代码的呢?

    本篇文章是对,你是不是这样写异常处理代码的进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • c#实现字符串反序输出字符串的实例

    c#实现字符串反序输出字符串的实例

    下面小编就为大家分享一篇c#实现字符串反序输出字符串的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12

最新评论