DataGridView имена столбцов из значений свойств объекта? - PullRequest
0 голосов
/ 16 марта 2011
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 показывает только людей в сетке и т. Д.).Я хотел бы, чтобы имя столбца было значениями для ColumnName в каждом объекте (например, 1,2,3), и я хочу, чтобы RowOrder был номером строки, в которой появляется имя. Поэтому я ищу вывод, который бы выгляделнапример:

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

Если координаты сетки не содержат значения, его следует оставить пустым.

Я относительно новичок в программировании winforms - поиск оставил меня сбольше вопросов о лучшем способе сделать это.Я установил привязку общих данных к списку объектов, но у меня остались столбцы с именами для каждого свойства (ColumnName, RowOrder и т. Д.), И я не буду упоминать, что это не решает, каждая моя вкладка / таблица данных показывает только то, что данные.

Является ли выражение linq хорошим способом объединения каждого DataGridView?Если да, то как мне создать выражение, которое меняет имена столбцов на значения в ColumnName?Могу ли я заказать по RowOrder, чтобы каждая строка была правильной, оставляя пустые места?

Было бы лучше, если бы я просто создал дополнительные списки объектов для заполнения каждой вкладки / сетки и выполнял сортировку / укладку вручную?

1 Ответ

1 голос
/ 16 марта 2011

Во-первых, вам нужно будет реорганизовать ваши структуры данных.Список имен с номерами строк и столбцов не помогает.Подумайте, с точки зрения вкладка содержит таблицу содержит строки содержит имена.

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