1

我的 C# 应用程序需要 2 个Datatables。第一个表是从数据库中填充的。第二个表需要动态构建,因此它将第一个表中的每一行复制 3 次,并显示具有不同列名的列的子集。

到目前为止,我已经通过构建 3 个linq查询然后连接结果来实现这一点。例如

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数据并因此自动刷新?

4

2 回答 2

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");

现在最终查询中的模型将利用该行的实例。如果它更改,您将获得新值,但如果您更改它,它也会更新该行。

于 2013-03-20T11:56:38.637 回答
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";
于 2013-03-20T12:02:21.507 回答