在datagridview中显示Yes / NO而不是True / False

时间:2013-07-31 21:05:26

标签: c# datagridview boolean

表格中有datagridview显示数据库表的内容,表格类型的一列是布尔值,因此在datagridview中显示true / false,但我想自定义它以显示是/否。 你建议哪种方式?

5 个答案:

答案 0 :(得分:17)

在自定义格式化方面,我想到了两种可能的解决方案。

1.处理CellFormatting事件并格式化您自己的事件。

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
     if (e.ColumnIndex == yourcolumnIndex)
     {
         if (e.Value is bool)
         {
             bool value = (bool)e.Value;
             e.Value = (value) ? "Yes" : "No";
             e.FormattingApplied = true;
         }
     }
 }

2.使用Custom Formatter

public class BoolFormatter : ICustomFormatter, IFormatProvider
{
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter))
        {
            return this;
        }
        return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (arg == null)
        {
            return string.Empty;
        }

        bool value = (bool)arg;
        switch (format ?? string.Empty)
        {
             case "YesNo":
                {
                    return (value) ? "Yes" : "No";
                }
            case "OnOff":
                {
                    return (value) ? "On" : "Off";
                }
            default:
                {
                    return value.ToString();//true/false
                }
        }
    }
 }

然后像这样使用它,并处理CellFormatting事件以使其正常工作

dataGridView1.Columns[1].DefaultCellStyle.FormatProvider = new BoolFormatter();
dataGridView1.Columns[1].DefaultCellStyle.Format = "YesNo";

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
     if (e.CellStyle.FormatProvider is ICustomFormatter)
     {
         e.Value = (e.CellStyle.FormatProvider.GetFormat(typeof(ICustomFormatter)) as ICustomFormatter).Format(e.CellStyle.Format, e.Value, e.CellStyle.FormatProvider);
         e.FormattingApplied = true;
     }
 }

修改 您可以订阅此类CellFormatting事件

dataGridView1.CellFormatting += dataGridView1_CellFormatting;

希望这有帮助

答案 1 :(得分:2)

    void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    var grid = (DataGridView)sender;
    if (grid.Columns[e.ColumnIndex].Name == "IsActive")
    {
        e.Value = (bool)e.Value ? "True_Text_Replace" : "False_Text_Replace";
        e.FormattingApplied = true;
    }
}

答案 2 :(得分:1)

如果你只想展示,那怎么样? 这很容易思考。

data.list$A$value = 1
data.list$B$value = 2
data.list$C$value = 3

答案 3 :(得分:0)

对于vb代码:

使用下面的代码将布尔真/假显示更改为Datagrid中的复选框:

datagrid1.Columns.Add(New DataGridViewCheckBoxColumn)

使用下面的代码显示列标题:

datagrid1.Columns(column number).HeaderText = "User Status"

答案 4 :(得分:0)

如果将列换为绑定到具有bool和string列的列表/数据表的DataGridViewComboBoxColumn,则它将bool解码为所需的任何字符串(用户可以编辑值,但不能放置错误的值在)

doOnBound(conn -> conn.addHandler...)

此网格现在将显示一个组合,它曾经显示一个复选框,并且编辑该组合将更改布尔值

您不必将组合列绑定到数据表。也许您希望使用Tuple或ValueTuple的列表作为Yes / No组合的后备数据存储:

        //your datatable has some boolean column and your DataGridView is bound to it
        DataTable dt = new DataTable();
        dt.Columns.Add("MyBoolColumn", typeof(bool));     //this is your bool column
        dataGridView1.DataSource = dt;


        //make a datatable that has 2 columns, string and bool, and 2 rows (one for true, one for false)
        DataTable dv = new DataTable();
        dv.Columns.Add("Dis");                  //it will be shown in the combo
        dv.Columns.Add("Val", typeof(bool));    //it will be used by the combo to set MyBoolColumn 
        dv.Rows.Add("Yeah baby", true);
        dv.Rows.Add("Nooo way", false);


        //make a combo box column bound to the values table above 
        //and connected to the table you show in the grid

        var dgvcbc = new DataGridViewComboBoxColumn();
        dgvcbc.DataPropertyName = "MyBoolColumn";          //connect to the grid table
        dgvcbc.DisplayMember = "Disp";                     //show this column
        dgvcbc.ValueMember = "Val";                        //use values from this
        dgvcbc.DataSource = dv;
        dataGridView1.Columns.Add(dgvcbc);

如果您的datagridview是在表单设计器中设计的,那么最简单的方法可能是将DispVal表添加到强类型的数据集,然后在选择器中将其作为“项目列表实例”提供,使您可以选择数据源用于组合列

enter image description here