none
如何设置DataGrid 行高? RRS feed

  • 问题

  • 在NCF中,除了提供Head的行高设置,好像没有设置其他行的行高的方法

    但是有些数据内容需要换行显示

    如果能够设置行高,和行宽

    我想是不是数据内容能够自动换行呢?
    2009年4月13日 2:09

答案

  • 试试一下两个函数:
    public void SetGridDefaultRowHeight(DataGrid dg, int cy)
    {
    FieldInfo fi = dg.GetType().GetField("m_cyRow",
                    BindingFlags.NonPublic|
                    BindingFlags.Static|
                    BindingFlags.Instance);
    fi.SetValue(dg, cy);
    dg.GetType().GetMethod("_DataRebind",
                     BindingFlags.NonPublic|
                     BindingFlags.Static|
                     BindingFlags.Instance).Invoke(dg, new object[] {});
    }

    public void SetGridRowHeight(DataGrid dg, int nRow, int cy)
    {
    ArrayList arrRows = (ArrayList)dg.GetType().GetField("m_rlrow",
                     BindingFlags.NonPublic|
                     BindingFlags.Static|
                     BindingFlags.Instance).GetValue(dg);
    object row = arrRows[nRow];
    row.GetType().GetField("m_cy",
                     BindingFlags.NonPublic|
                     BindingFlags.Static|
                     BindingFlags.Instance).SetValue(row, cy);
    }

    调用完毕上述函数, 请记得手动重绘,Grid.Invalidate()

    另外, 利用反射你可以充分的自定义DataGrid的一些隐藏属性,并使用它的一些非公开的方法, 比如以下代码打印了所有DataGrid的隐藏属性:
                System.Reflection.FieldInfo[] fis = 
    
                    typeof(DataGrid).GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
    
                foreach (var fi in fis)
    
                {
    
                    System.Diagnostics.Debug.WriteLine(fi.Name +" "+ fi.FieldType.ToString());
    
                }
    
    
    你可以根据需要自行修改。不过在你自己开始自定义DataGrid之前,请先阅读这篇文章:
    http://blogs.msdn.com/netcfteam/archive/2006/04/25/583542.aspx

    Goodluck~

    黄季冬
    http://fox23.cnblogs.com
    I'm a device.
    • 已标记为答案 moseszhou 2009年4月13日 14:24
    2009年4月13日 13:06
    版主

全部回复

  • 楼主可以参考博客园中的这两个帖子,提到了datagrid中内容显示自动换行的问题。
    Datagrid为什么不自动换行显
    轻松搞定DataGrid的项自动换行
    施炯
    2009年4月13日 5:54
    版主
  • 楼主可以参考博客园中的这两个帖子,提到了datagrid中内容显示自动换行的问题。
    Datagrid为什么不自动换行显
    轻松搞定DataGrid的项自动换行
    施炯
    不是在Asp.net 中哦,是在Mobile中。
    2009年4月13日 10:00
  • 试试一下两个函数:
    public void SetGridDefaultRowHeight(DataGrid dg, int cy)
    {
    FieldInfo fi = dg.GetType().GetField("m_cyRow",
                    BindingFlags.NonPublic|
                    BindingFlags.Static|
                    BindingFlags.Instance);
    fi.SetValue(dg, cy);
    dg.GetType().GetMethod("_DataRebind",
                     BindingFlags.NonPublic|
                     BindingFlags.Static|
                     BindingFlags.Instance).Invoke(dg, new object[] {});
    }

    public void SetGridRowHeight(DataGrid dg, int nRow, int cy)
    {
    ArrayList arrRows = (ArrayList)dg.GetType().GetField("m_rlrow",
                     BindingFlags.NonPublic|
                     BindingFlags.Static|
                     BindingFlags.Instance).GetValue(dg);
    object row = arrRows[nRow];
    row.GetType().GetField("m_cy",
                     BindingFlags.NonPublic|
                     BindingFlags.Static|
                     BindingFlags.Instance).SetValue(row, cy);
    }

    调用完毕上述函数, 请记得手动重绘,Grid.Invalidate()

    另外, 利用反射你可以充分的自定义DataGrid的一些隐藏属性,并使用它的一些非公开的方法, 比如以下代码打印了所有DataGrid的隐藏属性:
                System.Reflection.FieldInfo[] fis = 
    
                    typeof(DataGrid).GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
    
                foreach (var fi in fis)
    
                {
    
                    System.Diagnostics.Debug.WriteLine(fi.Name +" "+ fi.FieldType.ToString());
    
                }
    
    
    你可以根据需要自行修改。不过在你自己开始自定义DataGrid之前,请先阅读这篇文章:
    http://blogs.msdn.com/netcfteam/archive/2006/04/25/583542.aspx

    Goodluck~

    黄季冬
    http://fox23.cnblogs.com
    I'm a device.
    • 已标记为答案 moseszhou 2009年4月13日 14:24
    2009年4月13日 13:06
    版主
  • 试试一下两个函数:
    public void SetGridDefaultRowHeight(DataGrid dg, int cy)
    {
    FieldInfo fi = dg.GetType().GetField("m_cyRow",
                    BindingFlags.NonPublic|
                    BindingFlags.Static|
                    BindingFlags.Instance);
    fi.SetValue(dg, cy);
    dg.GetType().GetMethod("_DataRebind",
                     BindingFlags.NonPublic|
                     BindingFlags.Static|
                     BindingFlags.Instance).Invoke(dg, new object[] {});
    }

    public void SetGridRowHeight(DataGrid dg, int nRow, int cy)
    {
    ArrayList arrRows = (ArrayList)dg.GetType().GetField("m_rlrow",
                     BindingFlags.NonPublic|
                     BindingFlags.Static|
                     BindingFlags.Instance).GetValue(dg);
    object row = arrRows[nRow];
    row.GetType().GetField("m_cy",
                     BindingFlags.NonPublic|
                     BindingFlags.Static|
                     BindingFlags.Instance).SetValue(row, cy);
    }

    调用完毕上述函数, 请记得手动重绘,Grid.Invalidate()

    另外, 利用反射你可以充分的自定义DataGrid的一些隐藏属性,并使用它的一些非公开的方法, 比如以下代码打印了所有DataGrid的隐藏属性:
                System.Reflection.FieldInfo[] fis = 
    
                    typeof(DataGrid).GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
    
                foreach (var fi in fis)
    
                {
    
                    System.Diagnostics.Debug.WriteLine(fi.Name +" "+ fi.FieldType.ToString());
    
                }
    
    
    你可以根据需要自行修改。不过在你自己开始自定义DataGrid之前,请先阅读这篇文章:
    http://blogs.msdn.com/netcfteam/archive/2006/04/25/583542.aspx

    Goodluck~

    黄季冬
    http://fox23.cnblogs.com
    I'm a device.
    谢谢,你的这个方法挺好的,可以满足我的要求
    2009年4月13日 14:36