7

データベースのテーブルの内容を表示する形式のdatagridviewがあり、テーブル型の1列がbooleanなので、datagridviewではtrue/falseが表示されるのですが、Yes/Noを表示するようにカスタマイズしたいです。どの方法を提案しますか?

4

5 に答える 5

19

カスタム書式設定に関しては、2 つの解決策が考えられます。

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;

お役に立てれば

于 2013-07-31T21:49:00.767 に答える
4
    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;
    }
}
于 2016-08-23T08:12:23.663 に答える
1

見せたいだけならこれでどうだ。考えるのは簡単です。

private void Form1_Load(object sender, EventArgs e)
{
    List<Person> list = new List<Person>();
    list.Add(new Person(20, true));
    list.Add(new Person(25, false));
    list.Add(new Person(30, true));

    dgv.DataSource = list;

    //Hide checkbox column
    dgv.Columns["IsProgrammer"].Visible = false;

    //Add represent text column
    DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
    textColumn.Name = "Yes / No";
    dgv.Columns.Add(textColumn);

    //true/false -> yes/no
    foreach (var row in dgv.Rows.Cast<DataGridViewRow>())
        row.Cells["Yes / No"].Value = (bool)row.Cells["IsProgrammer"].Value ? "Yes" : "No";
}
private class Person
{
    public int Age { get; set; }
    public bool IsProgrammer { get; set; }

    public Person(int i, bool b)
    {
        Age = i;
        IsProgrammer = b;
    }
}
于 2016-02-10T11:11:21.067 に答える