我的C#应用程序需要2 Datatables
。第一个表是从数据库填充的。第二个表需要动态构建,因此它会复制第一个表中的每一行3次,并显示具有不同列名的列的子集。
到目前为止,我已经通过构建3个linq
查询然后连接结果来实现这一目标。 E.g。
var query1 = from result in MainDataTable.AsEnumerable()
select new
{
MyRowID = result.Field<string>("MyRowID"),
Type = "ABC",
ScheduleDate = result.Field<DateTime>("Date1")
};
var query2 = from result in MainDataTable.AsEnumerable()
select new
{
MyRowID = result.Field<string>("MyRowID"),
Type = "DEF",
ScheduleDate = result.Field<DateTime>("Date2")
};
var query3 = from result in MainDataTable.AsEnumerable()
select new
{
MyRowID = result.Field<string>("MyRowID"),
Type = "GHI",
ScheduleDate = result.Field<DateTime>("Date3")
};
var queryFinal = query1.Concat(query2).Concat(query3);
然后我将queryFinal设置为我的日历组件的数据源。
但是,在我再次运行上述代码之前,日历组件的MainDataTable
中不会显示对datasource
内容的任何更改。是否可以构建一个不是复制的对象或查询,引用MainDataTable
数据并因此自动刷新?
答案 0 :(得分:1)
因此,我现在能想到的唯一解决方案是将DataRow
包装在一个对象中。考虑这个课程:
public class ViewModel
{
private DataRow _model;
private string _dateField;
public ViewModel(DataRow row, string dateField)
{
_model = row;
_dateField = dateField;
}
public string MyRowID
{
get { return _model.Field<string>("MyRowID"); }
set { _model["MyRowID"] = value; }
}
public string Type { get; set; }
public DateTime ScheduleDate
{
get { return _model.Field<DateTime>(_dateField); }
set { _model[_dateField] = value; }
}
}
现在在你的LINQ语句中,构建一个ViewModel
而不是你现在的匿名类型:
var query1 = from result in MainDataTable.AsEnumerable()
select new ViewModel (result, "Date1");
现在最终查询中的模型将利用行的实例。如果它改变了,你将获得新值,但如果你改变它,它也会更新行。
答案 1 :(得分:0)
你能不能只复制行,删除不需要的列,重命名现有的列?
DataTable tbl2 = MainDataTable.Clone();
tbl2.Merge(MainDataTable.Copy());
tbl2.Merge(MainDataTable.Copy());
tbl2.Merge(MainDataTable.Copy());
tbl2.Columns.RemoveAt(0);
tbl2.Columns.RemoveAt(1);
tbl2.Columns[0].ColumnName = "SomeName";
tbl2.Columns[1].ColumnName = "SomeName";