如何从DataTable中取出一行并将其转换为自定义对象并使用它填充DataGridView?

时间:2016-08-18 17:43:18

标签: c# datagridview datatable

所以我有一个类,它将定时任务存储在其中:

class Task
{
    public string Description { get; set; }

    public TimeSpan Duration
    {
        get
        {
            if (BeginDate == DateTime.MinValue)
                return new TimeSpan(0, 0, 0);
            else if (EndDate == DateTime.MinValue)
                return DateTime.Now.Subtract(this.BeginDate);
            else
                return this.EndDate.Subtract(this.BeginDate);
        }
    }

    public DateTime BeginDate { get; set; }
    public DateTime EndDate { get; set; }
    public TaskStatus Status { get; set; }

    public Task()
    {
        this.Description = string.Empty;
        this.BeginDate = new DateTime();
        this.EndDate = new DateTime();
    }
}

public enum TaskStatus
{
    UNINVOICED,
    INVOICED,
    PAID
}

我使用这些列在DataTable和DataGridView之间使用DataBinding:

private void AddDataGridViewColumns()
{
    dgvTimesheet.Columns.Add(new DataGridViewTextBoxColumn()
    {
        Name = "id",
        Visible = false,
        DataPropertyName = "id"
    });

    dgvTimesheet.Columns.Add(new DataGridViewTextBoxColumn()
    {
        Name = "description",
        HeaderText = "Description",
        Visible = true,
        DataPropertyName = "description"
    });

    dgvTimesheet.Columns.Add(new DataGridViewTextBoxColumn()
    {
        Name = "duration",
        HeaderText = "Duration",
        Visible = true,

    });

    dgvTimesheet.Columns.Add(new DataGridViewTextBoxColumn()
    {
        Name = "begindate",
        HeaderText = "Date Started",
        Visible = false,
        DataPropertyName = "begindate"
    });

    dgvTimesheet.Columns.Add(new DataGridViewTextBoxColumn()
    {
        Name = "enddate",
        HeaderText = "Date Completed",
        Visible = true,
        DataPropertyName = "enddate"
    });

    dgvTimesheet.Columns.Add(new DataGridViewTextBoxColumn()
    {
        Name = "status",
        Visible = false,
        DataPropertyName = "status"
    });
}

每当用户需要添加新任务时,我手动将其添加到DataTable:

DataRow row = timesheet.Tasks().NewRow(); 
row["description"] = ActiveTask.Description; // String
row["begindate"] = ActiveTask.BeginDate; // DateTime object
row["enddate"] = ActiveTask.EndDate; // DateTime object
row["status"] = ActiveTask.Status; // Enum

然后我做了典型的:

DataTable.Rows.Add(DataRow)
DataAdapter.Update(DataTable),
DataAdapter.Fill(DataTable)

有没有办法使用Task对象作为在DataGridView和DataTable之间保存数据的对象,而不是创建与Task对象具有相同数据的DataRow?

每次我需要从DataGridView获取信息时,我需要转换值.ToString(),然后将其解析为我想要的值。

所以我在datagridview [“begindate”]列中有一个DateTime对象但要将其取回,我需要将其转换为字符串并再次将其解析为DateTime对象。如果我可以简单地访问DataGridView.Row [index] .BeginDate会更好。这可能吗?

TL; DR如何从DataTable中取一行并将其转换为自定义对象并用它填充DataGridView?

如果你想在整个项目中玩游戏是https://github.com/codeliger/timelord

的开源

0 个答案:

没有答案