Как безопасно получить доступ к именам столбцов DataGridView? - PullRequest
4 голосов
/ 27 августа 2009

При работе с ячейками DataGridView вы обычно делаете:

MyGrid.CurrentRow.Cells["EmployeeFirstName"].Value = "John";

все хорошо, но с ростом сложности вы начинаете беспокоиться об орфографических ошибках, проблемах с рефакторингом и т. Д.

Исторически, я просто сделал столбцы общедоступными, чтобы я мог получить к ним доступ непосредственно в экземпляре класса, но затем мне придется бороться с конструктором Windows Forms, который хочет сохранить их приватность (предположительно, потому что это хорошая практика).

Мое текущее решение состоит в том, чтобы иметь класс Cols с кучей строк:

public static class Cols
{
    public static string EmployeeFirstName = "EmployeeFirstName";
    ...
}

Что приводит к этому:

MyGrid.CurrentRow.Cells[Cols.EmployeeFirstName].Value = "John";

Это дает мне некоторое совершенство IntelliSense, а не ожидание ошибки во время выполнения. Это все еще кажется смутным взломом.

Есть ли еще более удобный способ сделать это?

Ответы [ 4 ]

6 голосов
/ 27 августа 2009

Если вы создали свои столбцы во время разработки, вы можете дать им разумные имена, такие как employeeFirstNameColumn.

Тогда вы можете добраться до клетки, используя что-то вроде:

MyGrid.CurrentRow.Columns[employeeFirstNameColumn.Name]

или, может быть:

MyGrid.CurrentRow.Columns[employeeFirstNameColumn.Index]

Если вы динамически генерируете столбцы (AutoGenerateColumns = true), у вас будут индексы столбцов, основанные на индексах столбцов источника данных, с которым вы также связываетесь. Таким образом, вы можете использовать аналогичный прием для получения индекса (особенно, если ваш источник данных - строго типизированный DataSet).

1 голос
/ 04 декабря 2009

Что вы можете сделать, это

for (int x = 0;x <tbl.Rows.Count;x++)//iterate through tables
         {
          Dataset.TableNameRow record = tbl[x];
            dataGridView1.Rows.Add();
            dataGridView1[colHandoffDate.Name,x].Value = record.HandoffDate;
          ....

Я добавил столбцы вручную, чтобы вы могли найти их в intellisense и использовать их имена (таким образом, вам не нужно создавать класс со строками)

0 голосов
/ 27 августа 2009

Единственный способ предотвратить проблемы во время выполнения - перехватить ArgumentException при попытке доступа к несуществующему элементу Cells. Например:

private void SetCellValue(DataGridViewCellCollection cells, string col, object value)
{
  try
  {
    cells[col].Value = value;
  } 
  catch (Exception ex)
  {
    Console.WriteLine(string.Format("Failed to set cell {0} to {1} Error={2}",col,value,ex.Message));
  }
}
0 голосов
/ 27 августа 2009

Вы можете использовать индекс для доступа к вашим столбцам как:

MyGrid.CurrentRow.Cells [1] .Value = "Джон";

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...