【问题标题】:replace true/false in datagridview columns替换 datagridview 列中的真/假
【发布时间】:2012-03-28 19:32:29
【问题描述】:

我有一个datagridview,我填写如下:

var q= repository.GetStudents();//

dataGridView1.DataSource = null;
dataGridView1.Columns.Clear();

dataGridView1.DataSource = q;

dataGridView1.Columns.RemoveAt(1);
//Remove IsActive 
//Cause I want to have my own implementation 

dataGridView1.Columns[0].DataPropertyName = "StudentID";
dataGridView1.Columns[0].HeaderText = "Studunet ID";

dataGridView1.Columns[1].DataPropertyName = "IsActive";
dataGridView1.Columns[1].HeaderText = "Status";

“IsActive”属性是布尔类型。当显示“IsActive”单元格时,它显示真/假。我想用我自己的自定义值替换它。

我阅读了thisthis 的帖子,但我无法解决我的问题。

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    您可以使用DataGridViewCellFormatting 事件,例如:

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

    编辑(根据评论):

    这与您现在所做的非常相似,只需删除绑定列并添加所需类型的新列并正确设置DataPropertyName,例如:

    this.dataGridView1.Columns.Remove("COL_TO_CUSTOMIZE");
    var btnCol = new DataGridViewDisableButtonColumn();
    btnCol.Name = "COL_TO_CUSTOMIZE";
    btnCol.DataPropertyName = "COL_TO_CUSTOMIZE";
    var col = this.dataGridView1.Columns.Add(btnCol);
    

    请注意,这会将列附加到末尾,但您可以使用dataGridView.Columns.Insert 方法而不是Add 来确定列的位置。

    【讨论】:

    • 谢谢,如果我想用我的自定义按钮替换它怎么办?有什么建议吗?我读过 [msdn.microsoft.com/en-us/library/ms171619.aspx],但我不知道如何在将网格视图绑定到数据时初始化“DataGridViewDisableButtonColumn”。
    • 不需要显式初始化'DataGridViewDisableButtonColumn'的'Enabled'属性吗?
    • @persianDev:理论上你应该可以通过访问((DataGridViewDisableButtonCell)dgv.Rows[i].Cells[j]).Enable来初始化属性,但实际上我注意到绑定数据源时属性有一些问题。但我不明白为什么......
    【解决方案2】:

    关于 DataGridViewComboBoxColumn 的一个有趣的事情是,您可以为它提供一个数据源,该数据源具有要查找的一列值和要显示的一列值,您可以将其绑定到另一列值,然后它将为您执行查找

    因此,假设您的学生集合 q(或任何他们)具有 IsActive 真/假,并且您希望它显示为“一直”或“没有机会”。让我们将一个组合框散列在一起这样做:

    var cb = new DataGridViewComboBoxColumn();
    cb.DisplayMember = "DisplayMe";   //the related text to show in the combo
    cb.ValueMember = "ValueToLookup"; //the name in the combo's lookup list
    cb.DataPropertyName = "IsActive"; //the name of your property on Student, to look up
    
    cb.DataSource = "All the time,Not a Chance"
      .Split(',')
      .Select(s => new { DisplayMe = s, ValueToLookup = (s[0] == 'A') } )
      .ToList();
    

    我们如何生成组合的数据源并不重要;在这里,我通过拆分将字符串转换为List<anonymous_string+bool>,然后选择具有我需要的两个属性名称的新匿名类型;您可以使用任何具有某些命名属性的东西 - KeyValuePair 列表、元组等等。

    关键是该组合可以读取您在 DataPropertyName 中引用的 q.IsActive bool,在 ValueMember 中命名的属性的列表中查找该 bool,然后显示在 DisplayMember 中命名的属性。它也适用于编辑,因此用户可以从组合中选择一个新项目,然后翻译以另一种方式返回 - “用户选择什么?它在 ValueMember 中命名的属性的值是什么,将该值放入学生在 DataPropertyName 中命名的 IsActive 属性”.. 它也不会停在布尔值上; value 成员可以是任何东西 - int、date 等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多