C# 对象属性值中的DataGridView列名?

C# 对象属性值中的DataGridView列名?,c#,winforms,linq,datagridview,linq-to-objects,C#,Winforms,Linq,Datagridview,Linq To Objects,如果栅格坐标不包含值,则应将其保留为空 我对winforms编程相对来说比较陌生——搜索给我留下了更多关于最好的方法的问题。我设置了到对象列表的通用数据绑定,但这给我留下了以每个属性(ColumnName、RowOrder等)命名的列,我不会提及这并不能解决我的每个选项卡/数据网格仅显示该数据的问题 linq表达式是组合每个DataGridView的好方法吗?如果是这样,我将如何设计一个将列名更改为ColumnName中的值的表达式?我可以通过RoWordER订购,让每一行正确吗?留下空白空间?

如果栅格坐标不包含值,则应将其保留为空

我对winforms编程相对来说比较陌生——搜索给我留下了更多关于最好的方法的问题。我设置了到对象列表的通用数据绑定,但这给我留下了以每个属性(ColumnName、RowOrder等)命名的列,我不会提及这并不能解决我的每个选项卡/数据网格仅显示该数据的问题

linq表达式是组合每个DataGridView的好方法吗?如果是这样,我将如何设计一个将列名更改为ColumnName中的值的表达式?我可以通过RoWordER订购,让每一行正确吗?留下空白空间?< /P>
如果我只是创建额外的对象列表来填充每个选项卡/网格并手动进行排序/堆叠,是否会更好?

首先,您需要重新组织数据结构。带有行和列编号的名称列表没有帮助。从选项卡包含表包含行包含名称的角度考虑

1           2           3
==================================
Bob Jones   Jane Jones  Jim Jones
Joe Jones               John Jones
private void AddRow(数据表dt,参数字符串[]名称)
{
//根据需要展开列
while(dt.Columns.Count0)
{
while(dt.Rows[0].ItemArray.Lengthx.Key==tabName).Value;
}

我明白了。但应用程序的工作方式是按列而不是按行。因此,在添加第二列之前,我将了解第1列中的所有内容。你能按列构建数据表吗?@Dave,我添加了允许按列添加的代码。首先按列添加,听起来有点奇怪。这样做有什么具体的原因吗。如果不是的话,我建议先做一行。这里的示例可能没有意义,但我正在构建的应用程序以特定的方式跟踪数据。每列代表一次演讲。每个单元格都包含该语音的一个参数。在第二栏开始之前,演讲1和第一栏已经完成。我们的想法是模仿现在纸面上的做法。@Dave,如果是这样的话,你最好为每一列创建一个datagridview,而不是将所有内容都塞进一个datagridview中。应该有比datagridview更好的控件可供使用。这些单元格应该是可编辑的吗?如果没有,您可能希望尝试使用listview或listbox。
1           2           3
==================================
Bob Jones   Jane Jones  Jim Jones
Joe Jones               John Jones
private void AddRow(DataTable dt, params string[] names)
{
    // Expand columns as required
    while (dt.Columns.Count < names.Length)
    {
        DataColumn col = dt.Columns.Add();
        col.ColumnName = dt.Columns.Count.ToString();
    }
    // Add new row
    DataRow row = dt.NewRow();
    for (int i = 0; i < names.Length; i++)
        row[i] = names[i];
    dt.Rows.Add(row);
}
private void AddToColumn(DataTable dt, int rowIdx, int colIdx, string name)
{
    while (dt.Columns.Count < colIdx)
    {
        DataColumn col = dt.Columns.Add();
        col.ColumnName = dt.Columns.Count.ToString();
    }
    if (dt.Rows.Count > 0)
    {
        while (dt.Rows[0].ItemArray.Length < colIdx)
            dt.Rows[0][dt.Rows[0].ItemArray.Length] = "";
    }
    DataRow row;
    if (rowIdx < dt.Rows.Count)
    {
        row = dt.Rows[rowIdx];
        row[colIdx - 1] = name;
    }
    else
    {
        row = dt.NewRow();
        row[colIdx - 1] = name;
        dt.Rows.Add(row);
    }
}
private void buttonStart_Click(object sender, EventArgs e)
{
    Dictionary<string, DataTable> workers = new Dictionary<string, DataTable>();

    DataTable dt = new DataTable();
    AddRow(dt, "Bob Jones", "Jane Jones", "Jim Jones");
    AddRow(dt, "Joe Jones", "", "John Jones");
    workers.Add("Foo", dt);

    AddToColumn(dt, 0, 4, "Testing"); // Use this if you have to add by column

    dt = new DataTable();
    AddRow(dt, "Worker Bee1",  "Worker Bee2");
    workers.Add("Bar", dt);

    string tabName = "Foo";
    dataGridView1.DataSource = workers.FirstOrDefault(x => x.Key == tabName).Value;
}