Как получить доступ к ячейке в DataRowView на основе столбцов DataPropertyName? - PullRequest
2 голосов
/ 25 января 2011

У меня есть приложение Windows Forms с DataSet.Я просто использовал данные |Добавьте New DataSource, чтобы добавить таблицу Products базы данных Northwind в мои DataSources, и создали DataGridView, показывающий содержимое таблицы Products.Я только что перетащил таблицу «Продукты» из окна «Источники данных» в форму, чтобы все столбцы создавались автоматически.

Теперь я хочу, чтобы строки, содержащие продукт, для которого столбец «Снят с производства» был истинным, были нарисованы в другомцвет.Я создал обработчик событий CellPainting для него, но у меня возникают проблемы с поиском значения для столбца Discontinued.

Поскольку DataGridView создается автоматически, столбцы в нем имеют имена вроде dataGridViewTextBoxColumn1, который имеет DataPropertyName "ProductID".

Мой вопрос: как я могу найти значение для Discontinued на основе DataPropertyName?Или я должен использовать имя самого столбца? (В таком случае мне лучше дать ему осмысленное имя)

Мой код:

private void productsDataGridView_CellPainting(object sender,
    DataGridViewCellPaintingEventArgs e)
{
    if (e.RowIndex >= 0)
    {
        var row = productsDataGridView.Rows[e.RowIndex];
        if ((bool) (row.Cells[ nameOrIndexOfColumn ].Value))
        {
            e.CellStyle.ForeColor = Color.DarkGray;
        }
    }
}

Как получить доступ к значению столбца с помощью DataPropertyName«Снято с производства»?


Решение

Судя по ответу Нила Барнвелла, похоже, что это так.

private void productsDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.RowIndex >= 0)
    {
        var productView = (DataRowView) productsDataGridView.Rows[e.RowIndex].DataBoundItem;
        var product = productView.Row as NorthwindDataSet.ProductsRow;
        if (product != null && product.Discontinued)
        {
            e.CellStyle.ForeColor = Color.DarkGray;
        }
    }
}

БольшоеПреимущество этого заключается в том, что значение Discontinued не обязательно должно быть фактическим столбцом в DataGridView.

Ответы [ 3 ]

1 голос
/ 25 января 2011

Почему бы вам не попытаться дать название этому конкретному столбцу самостоятельно, и тогда вы знаете, как получить к нему доступ. Visual Studio не должна иметь никаких проблем с этим, даже если она генерируется автоматически. Потому что он был сгенерирован, чтобы помочь вам выполнять все связывание и создание столбцов в фоновом режиме. Но он все еще доступен для редактирования , автоматически сгенерированный не означает, что он сгенерирован во время выполнения. Это просто помогает вам делать обычные вещи, но вы все равно можете редактировать его.

row.Cells[ nameOrIndexOfColumn ]
1 голос
/ 25 января 2011

Не получайте значение из столбца в сетке, получите значение из фактического datarow, который заполняет сетку.Таким образом, вы можете избежать всех магических струн и т. Д.

Необходимо выполнить небольшой кастинг, потому что [Type]DataRow скрыт внутри DataView, прикрепленного к сетке, но он более элегантенподход (и гораздо менее хрупкий в случае будущих изменений), если вы красиво интегрируете его в свой код, а не полагаетесь на магические строки.

Вот мой старый пост в блоге, который подробно описывает, как это сделать:

http://koder.wordpress.com/2010/04/09/getting-data-from-a-winforms-datagridview/

ОБНОВЛЕНИЕ
Вы упомянули, что используете Northwind и что вы просто «перетащили таблицу продуктов в форму», поэтомуЯ предполагаю, что это не критически важная часть программного обеспечения, но для удобства читателей, я просто хотел предположить, что это не будет типичным подходом в реальном приложении.

Обычно в наши дни мы рассматриваем возможность использования доменной модели , возможно, с использованием ORM для получения наших доменных объектов из хранилища данных (конечно, наборы данных не являются настоящим ORM), затемвозможно, используя такие вещи, как MVVM для создания структур данных, оптимизированных для привязки к элементам пользовательского интерфейса из этих доменных объектов.

Используя этот подход, поскольку у вас есть фактические данные для передачи в ViewModel, вы можетевычислять такие правила, как цвета и т. д., из реальных данных, а пользовательский интерфейс просто отображает результаты применения этих бизнес-правил.

0 голосов
/ 25 января 2011

Вы можете попробовать что-то на этих линиях

if (dataGridView1.Columns[e.ColumnIndex].DataPropertyName == "Discontinued")
{
  if (dataGridView1[reqdColumnIndex, e.RowIndex].FormattedValue as bool)
  {
    e.CellStyle.ForeColor = Color.Gray;
  }
}

reqdColumnIndex - это столбец с вашим значением bool

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