c# - c# windows窗体应用程序中将通用列表项绑定到不同网格
问题描述
我创建了以下类:
public interface ISFRDataSet
{
}
public interface ISFRStaticDataSet : ISFRDataSet
{
}
public interface ISFRTransientDataSet : ISFRDataSet
{
}
public class DataSet0 : ISFRStaticDataSet
{
public int Id { get; set; }
public string Text { get; set; }
}
public class DataSet1 : ISFRStaticDataSet
{
}
public class DataSet2 : ISFRStaticDataSet
{
}
public class DataSet3 : ISFRTransientDataSet
{
}
然后我创建了一个 ISFRDataSet 列表,并向其中添加了一个 DataSet1、2 和 3 的实例。
Dictionary<string, List<ISFRDataSet>> dsList = new Dictionary<string, List<ISFRDataSet>>();
dsList.Add("DataSet1", GetDataSet1Data(segmentId));
dsList.Add("DataSet2", GetDataSet2Data(segmentId));
dsList.Add("DataSet3", GetDataSet3Data(segmentId));
...
这个列表被发送到一个表单,表单迭代列表中的每个 ISFRDataSet 对象;为每个创建一个网格,并将对象绑定到网格。
我期待 DataSet1、2 和 3 的公共属性将在每个网格中显示为列。但是没有显示列,我假设是因为 ISFRDataSet 接口没有任何属性。有没有办法实现我的期望?
谢谢
解决方案
您可以使用此特殊关键字dynamic
来绑定 gridview 的数据源。
像这个可行的代码和所有网格都会生成列。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Dictionary<string, List<ISFRDataSet>> dsList = new Dictionary<string, List<ISFRDataSet>>();
dsList.Add("DataSet1", GetDataSet1Data());
dsList.Add("DataSet2", GetDataSet2Data());
dsList.Add("DataSet3", GetDataSet3Data());
var list1 = new BindingList<dynamic>(DataSetConverter(dsList["DataSet1"]));
dataGridView1.DataSource = list1;
var list2 = new BindingList<dynamic>(DataSetConverter(dsList["DataSet2"]));
dataGridView2.DataSource = list2;
var list3 = new BindingList<dynamic>(DataSetConverter(dsList["DataSet3"]));
dataGridView3.DataSource = list3;
}
private List<dynamic> DataSetConverter<TSource>(List<TSource> source) where TSource : class, ISFRDataSet
{
return source.Cast<dynamic>().ToList();
}
private List<ISFRDataSet> GetDataSet3Data()
{
return new List<DataSet3>
{
new DataSet3
{
CreateTime = DateTime.Now.AddDays(1),
Name = "TN1"
},
new DataSet3
{
CreateTime = DateTime.Now.AddDays(3),
Name = "TN2"
}
}.Cast<ISFRDataSet>().ToList();
}
private List<ISFRDataSet> GetDataSet2Data()
{
return new List<DataSet2>
{
new DataSet2
{
ProductId = 1,
Price = 5.5M
},
new DataSet2
{
ProductId = 2,
Price = 6.6M
}
}.Cast<ISFRDataSet>().ToList();
}
private List<ISFRDataSet> GetDataSet1Data()
{
return new List<DataSet1>
{
new DataSet1
{
TestId = 1,
TestText = "t1"
},
new DataSet1
{
TestId = 2,
TestText = "t2"
}
}.Cast<ISFRDataSet>().ToList();
}
}
public interface ISFRDataSet
{
}
public interface ISFRStaticDataSet : ISFRDataSet
{
}
public interface ISFRTransientDataSet : ISFRDataSet
{
}
public class DataSet0 : ISFRStaticDataSet
{
public int Id { get; set; }
public string Text { get; set; }
}
public class DataSet1 : ISFRStaticDataSet
{
public int TestId { get; set; }
public string TestText { get; set; }
}
public class DataSet2 : ISFRStaticDataSet
{
public int ProductId { get; set; }
public decimal Price { get; set; }
}
public class DataSet3 : ISFRTransientDataSet
{
public string Name { get; set; }
public DateTime CreateTime { get; set; }
}
推荐阅读
- django - Django:为由 social-auth-app-django 和 google_oauth2 创建的用户设置 is_active 标志
- php - laravel 中同一列数据的 where 和 orWhere 问题
- git - 如何为 jgit 使用或启用 git Trace2 API?
- angular - 计算 observable 回报的平均值
- reactjs - 拒绝框架“https://www.facebook.com/”,因为祖先违反了内容安全政策:“frame-ancestors https://www.facebook.com”
- javascript - Javascript删除对象中的属性并保留原始对象数据
- time-complexity - 单循环的最佳时间复杂度?
- scala - 在 Play 中更新 JsObject 内的对象内的键
- r - 更改特定列,字符串(在所有行中相同地重复)顺序
- c++ - 特征:静态断言失败