zoukankan      html  css  js  c++  java
  • C# WinForm DataGridView让DataPropertyName支持复杂属性

    首先给Grid添加BindingSource,类型为BindingForForm2。或者设置Grid的DataSource为IEnumerable<BindingForForm2>。

    BindingForForm2类型如下。

    复制代码
     public class BindingForForm2
        {
            public int Age { get; set; }
            public string Name { get; set; }
            public int Height { get; set; }
            public int Weight { get; set; }
            public ClassTest ClassTest { get; set; }
    
        }
    
        public class ClassTest
        {
            public string S1 { get; set; }
            public string S2 { get; set; }
        }
    复制代码
    View Code

     我们想在Grid上直接显示BindingForForm2中ClassTest属性的S1和S2属性。可以如下图设置DataPropertyName。直接设置用属性点的方式。

    然后如下注册DataGridView的CellFormatting事件即可。代码大致意思是,先取到当前选中行的Object(此处为BindingForForm2),然后取到DataPropertyName的设置,再循环用反射读取想要的值。

    复制代码
     1  private void DataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
     2         {
     3             if (e.Value != null) return;
     4             try
     5             {
     6                 var dgv = (DataGridView)sender;
     7                 object obj = null;
     8                 var source = dgv.DataSource as BindingSource;
     9                 if (source != null)
    10                 {
    11                     obj = ((IEnumerable<object>)source.DataSource).ElementAt(e.RowIndex);
    12                 }
    13                 else if (dgv.DataSource is IEnumerable<object>)
    14                 {
    15                     obj = ((IEnumerable<object>)dgv.DataSource).ElementAt(e.RowIndex);
    16                 }
    17                 var col = dgv.Columns[e.ColumnIndex];
    18                 var props = col.DataPropertyName.Split('.');
    19                 foreach (var prop in props)
    20                 {
    21                     if (obj == null) return;
    22                     var p = obj.GetType().GetProperty(prop);
    23                     if (p == null) return;
    24                     obj = p.GetValue(obj, null);
    25                 }
    26                 e.Value = obj;
    27             }
    28             catch
    29             {
    30                 //ignore
    31             }
    32         }
    复制代码

    效果:

    bindingSource填充数据

     bindingForForm2BindingSource.DataSource = new List<BindingForForm2>
                {
                    new BindingForForm2 {Age = 10, Height = 120, Name = "xxx", ClassTest = new ClassTest {S1 = "sdjfkljlk"}},
                    new BindingForForm2 {Age = 12, Height = 120, Name = "asd", ClassTest = new ClassTest {S2 = "ccccccc"}},
                    new BindingForForm2 {Age = 14, Height = 120, Name = "asdd"}
                };
    View Code

    GridView显示

    转载请注明出处。 http://www.cnblogs.com/JmlSaul/p/7726233.html

  • 相关阅读:
    调用系统相机导致照片旋转问题的修复
    JavaLearning:日期操作类
    PHP实现事件机制实例分析
    按下葫芦起了瓢
    win系统下的eclipse连接和使用linux上的hadoop集群
    利用gradle加入构建版本
    从设计到实现,一步步教你实现Android-Universal-ImageLoader-辅助类
    I帧、P帧和B帧的特点
    tcp_tw_recycle检查tcp_timestamps的内核代码
    OBS源码编译开发
  • 原文地址:https://www.cnblogs.com/zwj1276952588/p/10538744.html
Copyright © 2011-2022 走看看