如何更改属性在GridDataView中的显示方式

时间:2013-01-10 23:04:10

标签: c#

情况如下:

我有Form,其中包含DataGridViewDataGridView绑定到对象BindingSource。 绑定的对象具有Property,这是枚举。

我想要做的是在DataGridView中添加一列,但不是显示枚举的数量,而是要将其映射到String

有一种简单的方法吗?

我正在考虑向返回我要展示的Property的模型添加另一个String,但如果可能的话,我想避免这种情况。

编辑:

enum就是这样:

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

我对C#世界很陌生,所以也许我做错了什么

4 个答案:

答案 0 :(得分:1)

我将在BusinessObject类中创建一个新字段,该字段表示枚举的字符串表示形式,并将DataGridView的Column绑定到此属性。这种方法是否符合您的要求?

public string EnumString {
  get { 
    FilterClass fClass = this.FilterClass;
    return fClasss.ToString();
  }
}

答案 1 :(得分:1)

您是否想要在字符串表示中获取每个枚举的名称

例如在你的班级做类似的事情

这只是你放置Enum声明的一个例子请让我知道如果这是你想要的其他明智我将不得不改变我的答案

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());
        }
    }
 } 

答案 2 :(得分: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对象

enter image description here

然后结果将是这样的:

enter image description here

答案 3 :(得分:0)

您可以为DataGridView.CellFormatting编写事件处理程序。在处理程序中,第一个参数是DataGridView(声明为对象),第二个参数是DataGridViewCellFormattingEventArgs类型,它有一个属性ColumnIndex。如果调用是针对正确的列索引,那么您可以从row获取cellDataGridView,然后以您喜欢的方式格式化单元格。

还有一种更复杂的方法,您可以将事件处理程序分配给列,但我在此不再重复。如果您对此方法感兴趣,请参阅我的其他帖子。

因此,在您想要显示的对象上创建另一个属性可能更简单。但我已经为完整性添加了这个答案。