2009-06-23 2 views
1

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

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

ответ

0

Редактировать столбец, который отображает логическое значение, так что свойство 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.

+0

Я не вижу свойства «ColumnType»: Me.DGV.Columns («ColName»).? – Simon

+0

Я немного разъяснил, как это сделать! –

+0

Хорошая идея, но мне нужно сделать это программно, так как DGV динамически создается во время выполнения. – Simon

3

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

+0

Верно, но вы можете установить ColumnType при создании столбца, прежде чем добавлять его в DataGridView. –

5

Как уже упоминалось выше, представляется невозможным изменить визуальный вид логических значений в сценарии, связанном с данными. Даже 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"; 
    } 
} 
Смежные вопросы