簡體   English   中英

來自對象屬性值的DataGridView列名稱?

[英]DataGridView column names from object property values?

public class Employee
{
  public int ColumnName {set; get;}
  public int RowOrder {set; get;}
  public string TabName {set; get;}
  public string Names {set; get;}
}

BindingList<Employee> workers = new BindingList<Employee>();
workers.Add(new Employee(1, 0, "Foo", "Bob Jones"));
workers.Add(new Employee(2, 0, "Foo", "Jane Jones"));
workers.Add(new Employee(3, 0, "Foo", "Jim Jones"));
workers.Add(new Employee(1, 1, "Foo", "Joe Jones"));
workers.Add(new Employee(3, 1, "Foo", "John Jones"));
workers.Add(new Employee(1, 0, "Bar", "Worker Bee1"));
workers.Add(new Employee(2, 0, "Bar", "Worker Bee2"));    

我有一個帶有標簽條的winform。 可以動態添加選項卡,並且它們的名稱與TabName屬性相同。 每個選項卡都包含一個DataGridView,該名稱也與TabName屬性相同。

因此,每個選項卡/網格視圖應僅顯示來自正確對象的數據(foo選項卡僅顯示網格中的foo人,等等)。 我希望列名是每個對象(例如1,2,3)中ColumnName的值,並且我希望RowOrder是該名稱出現在其中的行號。所以我正在尋找看起來像的輸出如下所示:

1           2           3
==================================
Bob Jones   Jane Jones  Jim Jones
Joe Jones               John Jones

如果網格坐標不包含值,則應將其留空。

對於Winforms編程,我相對較新-搜索給我留下了更多有關最佳方法的疑問。 我設置了與對象列表的通用數據綁定,但這給我留下了以每個屬性(ColumnName,RowOrder等)命名的列,並且我不會提及這不能解決我的每個tab / datagrid僅顯示該數據的問題。

linq表達式是將每個DataGridView放在一起的好方法嗎? 如果是這樣,我將如何制作一個將列名更改為ColumnName中的值的表達式? 我可以按RowOrder排序以使每行正確保留空白嗎?

如果我僅創建其他對象列表來填充每個選項卡/網格並手動進行排序/堆疊,我會更好嗎?

首先,您將需要重新組織數據結構。 名稱列表及其行號和列號無濟於事。 認為在選項卡包含表包含行包含名稱。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM