Может ли связанный DataGridView использовать текстовую ячейку для логических значений? - PullRequest
1 голос
/ 23 июня 2009

У меня есть DGV, связанный со списком объектов. Это прекрасно работает, за исключением того, что одно из свойств объекта является логическим и поэтому отображается как флажок, но я бы предпочел простое текстовое поле да / нет. Я рассмотрел добавление дополнительного столбца и заполнение соответствующей строкой, основанной на логическом значении, но это кажется немного чрезмерным. Есть ли более простой способ?

DGV только для чтения.

Ответы [ 3 ]

5 голосов
/ 05 июля 2009

Как упомянуто выше, кажется невозможным изменить внешний вид логических значений в сценарии с привязкой к данным. Даже DataGridViewCellStyle.FormatProvider неправильно работает с такими типами, как System.Int32, System.Int64, System.Decima и т. Д.

Поэтому я нашел обходной путь, который работает для меня. Возможно, это не лучшее решение, но в настоящее время оно соответствует моим потребностям. Я обрабатываю событие DataGridView.ColumnAdded и заменяю DataGridViewCheckBoxColumn на DataGridViewTextBoxColumn . После этого я использую событие CellFormating (рекомендуется Microsoft, см. Ссылки выше) для форматирования исходных данных.

private DataGridViewTextBoxColumn textBoxColumn = null;
void _dataGrid_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
    // Avoid recursion
    if (e.Column == textBoxColumn) return;

    DataGridView gridView = sender as DataGridView;
    if (gridView == null) return;

    if( e.Column is DataGridViewCheckBoxColumn)
    {
        textBoxColumn = new DataGridViewTextBoxColumn();
        textBoxColumn.Name = e.Column.Name;
        textBoxColumn.HeaderText = e.Column.HeaderText;
        textBoxColumn.DataPropertyName = e.Column.DataPropertyName;

        gridView.Columns.Insert(e.Column.Index, textBoxColumn);
        gridView.Columns.Remove(e.Column);
    }
}

void _dataGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    DataGridViewColumn col = _dataGrid.Columns[e.ColumnIndex];

    try
    {
        if ( col.Name == "IsMale")
        {
            bool isMale = Convert.ToBoolean(e.Value);
            e.Value = isMale ? "male" : "female";
        }
    }
    catch (Exception ex)
    {
        e.Value = "Unknown";
    }
}
3 голосов
/ 23 июня 2009

Похоже, это невозможно, поэтому я обманул. Я добавил свойство только для чтения в свой бизнес-объект, который возвращает строку на основе логического свойства. Я просто спрятал логический столбец в DGV и отобразил свойство строки.

0 голосов
/ 23 июня 2009

Отредактируйте столбец, который отображает логическое значение, поэтому свойство ColumnType = DataGridViewTextBoxColumn.

В столбце теперь будут отображаться строки True / False.

Внесите это изменение в конструктор:

  1. В конструкторе щелкните правой кнопкой мыши DGV.

  2. Во всплывающем меню выберите «Редактировать столбцы ...» Появится диалоговое окно «Редактировать столбцы».

  3. В диалоговом окне «Редактирование столбцов» выберите столбец слева и найдите свойства (включая ColumnType) справа.

Вы можете установить ColumnType программно при добавлении столбца в DGV:

DataGridViewColumn column = new DataGridViewColumn();
DataGridViewCell cell = new DataGridViewTextBoxCell();
column.CellTemplate = cell;
dgv.Columns.Add(column);

Код от MSDN .

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