代码之家  ›  专栏  ›  技术社区  ›  Simon

绑定的DataGridView能否将文本单元格用于布尔值?

  •  1
  • Simon  · 技术社区  · 17 年前

    DGV是只读的。

    3 回复  |  直到 17 年前
        1
  •  5
  •   Alex    17 年前

    如上所述,在数据绑定场景中,似乎不可能更改布尔值的视觉外观。 甚至 D级ataGridViewCellStyle.FormatProvider提供程序 无法正确处理以下类型系统.Int32, 系统.Int64, 系统分贝等等。

    因此我找到了一个适合我的解决方法。也许这不是最好的解决方案,但目前它适合我的需要。 DataGridView.ColumnAdded 事件和替换 DataGridViewCheckBox列 DataGridViewTextBoxColumn . 之后我用 细胞形成 事件(由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";
        }
    }
    
        2
  •  3
  •   Simon    17 年前

    看来这是不可能的,所以我作弊了。我向业务对象添加了一个只读属性,该属性返回一个基于布尔属性的字符串。我只是在DGV中隐藏了boolean列并显示了string属性。

        3
  •  0
  •   Jay Riggs    17 年前

    编辑显示布尔值的列,使ColumnType属性=DataGridViewTextBoxColumn。

    在设计器中进行以下更改:

    1. 在设计器中,在DGV上单击鼠标右键。

    2. 在弹出菜单上,选择“编辑列…”,将出现“编辑列”对话框。

    3. 在“编辑列”对话框中,选择左侧的列并找到右侧的属性(包括ColumnType)。

    将列添加到DGV时,可以通过编程方式设置ColumnType:

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

    代码来自 MSDN

        4
  •  0
  •   Caius Jard    6 年前

    一种有用的方法是使用DataGridViewComboBoxColumn将布尔值解码为所需的任何字符串;它还保留了编辑值的功能,甚至可以为用户提供快捷方式,如果您确保显示值列表具有不同的首字母(用户可以聚焦单元格并按键盘上的单个键来更改组合选择)。

    组合列不仅仅限于布尔值-任何固定的值列表、查找、枚举等都是很好的候选。这是连接布尔值的方式;它使用string/bool的元组作为组合查找的后备存储:

          dataGridView1.Columns.Add(new DataGridViewComboBoxColumn() {
              DataPropertyName = "NameOfYourBoolColumnInYourDataTableThatTheGridIsBoundTo";
              DisplayMember = "Item1",                       //the string in the Tuple
              ValueMember = "Item2",                         //the bool in the Tuple
              DataSource = new List<Tuple<string, bool>>() { //the list of Tuples
                new Tuple<string, bool>("Yeah baby", true),
                new Tuple<string, bool>("Noooo way", false)
              }
          });
    

    这个网格现在将显示一个组合框,它曾经显示过一个复选框,编辑组合框将更改主数据表中的布尔值


    如果您的datagridview是在forms designer中设计的,那么最简单的方法可能是向强类型数据集添加一个DispVal表,然后它在选择器中成为一个“项目列表实例”,允许您为combo列选择数据源

    推荐文章