0

状況はこれです:

Form含むがありDataGridViewます。それDataGridViewはオブジェクトにバインドされていますBindingSource。バインドされたオブジェクトPropertyには、列挙型であるaがあります。

私がやりたいのは列を入れることですがDataGridView、列挙型の数を表示する代わりに、それをにマップしたいと思いますString

これを行う簡単な方法はありますか?

Property見せたいモデルにもう1つ追加することを考えていますStringが、なるべく避けたいと思います。

編集:

これenumはこれです:

public enum FilterClass
{
    TypeAFilter = 1,
    TypeBFilter = 2,
    TypeCFilter = 3
};

私はC#の世界にまったく慣れていないので、何か完全に間違ったことをしているのかもしれません

4

4 に答える 4

1

文字列表現の各列挙型の名前を取得しますか

たとえば、クラスで次のようなことをします

これは、列挙型宣言を配置する場所の単なる例です。これが必要な場合はお知らせください。それ以外の場合は、回答を変更する必要があります。

namespace sampleLogin
{
    public enum FilterClass
    {
        TypeAFilter = 1,
        TypeBFilter = 2,
        TypeCFilter = 3
    };

    public partial class frmLogin : Form
    {
      public frmLogin()
      {
        InitializeComponent();

        foreach (FilterClass fltClass in Enum.GetValues(typeof(FilterClass)))
        {
            Console.WriteLine(fltClass.ToString());
        }
    }
 } 
于 2013-01-10T23:36:03.650 に答える
1

列挙型の文字列表現を表すBusinessObjectクラスに新しいフィールドを作成し、DataGridViewのColumnをこのプロパティにバインドします。このアプローチはあなたの要件を満たしていますか?

public string EnumString {
  get { 
    FilterClass fClass = this.FilterClass;
    return fClasss.ToString();
  }
}
于 2013-01-10T23:28:42.433 に答える
1

ビジネスオブジェクトを変更できないと想像してみてください(サードパーティのコンポーネントであると仮定します)。カスタム列を簡単に作成できます。

private void Form1_Load(object sender, EventArgs e)
{
    // filling up example data
    var s = new List<InfoItem>();
    s.Add(new InfoItem() { PropertyA = "PA", PropertyB = 1, PropertyC = DateTime.Now, PropertyD = InfoItemType.Item_B });
    s.Add(new InfoItem() { PropertyA = "PB", PropertyB = 2, PropertyC = DateTime.Now, PropertyD = InfoItemType.Item_C });
    s.Add(new InfoItem() { PropertyA = "PC", PropertyB = 3, PropertyC = DateTime.Now, PropertyD = InfoItemType.Item_A });
    s.Add(new InfoItem() { PropertyA = "PD", PropertyB = 4, PropertyC = DateTime.Now, PropertyD = InfoItemType.Item_B });

    // assign my collection to the DataGrid
    dg.DataSource = s;

    // let's create one more column at the end
    var column = new DataGridViewColumn();
    column.CellTemplate = new DataGridViewTextBoxCell();
    column.HeaderText = "Custom Column";
    column.Name = "customColumn"; // important name to remember
    column.DataPropertyName = "PropertyD"; // the Enum Property
    dg.Columns.Add(column); // add the column
}

// let's make the use of the `CellFormatting` event
private void dg_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    // If the column is the "customColumn", check the value. 
    if (this.dg.Columns[e.ColumnIndex].Name == "customColumn")
    {
        if (e.Value != null)
        {
            // let's change to whatever we want...
            switch ((InfoItemType)e.Value)
            {
                case InfoItemType.Item_A: e.Value = "I'm A"; break;
                case InfoItemType.Item_B: e.Value = "I'm B"; break;
                case InfoItemType.Item_C: e.Value = "I'm C"; break;
                default: e.Value = "I'm not..."; break;
            }
        }
    }
}

DataGridViewイベントをオブジェクトに添付することを忘れないでください

ここに画像の説明を入力してください

その場合、結果は次のようになります。

ここに画像の説明を入力してください

于 2013-01-11T00:08:56.150 に答える
0

のイベントハンドラを作成できますDataGridView.CellFormatting。ハンドラーでは、最初のパラメーターはDataGridView(オブジェクトとして宣言)であり、2番目のパラメーターはタイプDataGridViewCellFormattingEventArgsであり、プロパティがありますColumnIndex。正しい列インデックスを呼び出す場合は、、から、rowを取得して、セルを任意の方法でフォーマットできます。 cellDataGridView

イベントハンドラーを列に割り当てることができるさらに複雑な方法もありますが、ここでは繰り返しません。この方法に興味がある場合は、他の投稿を参照してください。

したがって、表示したいオブジェクトに別のプロパティを作成する方がおそらく簡単です。しかし、完全を期すためにこの回答を追加しました。

于 2013-01-11T00:00:16.607 に答える