通过字段引用而不是列字符串名称在DataGridView中隐藏列

时间:2018-08-22 03:53:13

标签: c# winforms linq datagridview

我正在编写一个程序,其中使用DataGridView显示数据,我希望有一种方法可以访问列的可见属性,而无需指定索引位置或“列名”字符串值。

public class test {
    public static string value1 { get; set; }
    public static string value2 { get; set; }
}

我正在使用LINQ to SQL数据上下文查询要显示在我的DataGridView中的信息。

就目前而言,我似乎只能找到一种改变Columns可见属性的方法(假设DataGridView实例化为dgvDATA)

dgvDATA.columns["value1"].visible = false;

有什么办法可以做以下事情?我认为是否可以通过数据绑定来实现,但是我尝试过并且无法弄清楚。

dgvDATA.column.value1.visible = false;

我发现本文指出,DataGridView没有内置这种功能,但是有一种解决方法,您可以添加一个数据库字段来表示是否希望它可见。

但是该文章写于2011年,所以我很难相信这样的事情从未实现。

https://dotnetbuildingblocks.wordpress.com/2011/07/30/binding-datagrid-column-visibility-to-a-datacontext/

请告诉我这是否可行!谢谢

2 个答案:

答案 0 :(得分:0)

DataGridView不支持您的要求。

无论如何,如果您的唯一目标是避免使用硬编码的字段名,那么使用nameof()是有意义的。

您的情况将是

dgvDATA.Columns[nameof(test.value1)].Visible = false;

这样,以后再重构代码就不会有问题。

答案 1 :(得分:0)

显然,您需要某种特殊的DataGridViewColumn,其中可以使用标准DataGridViewcolumn中不可用的某些标识来标识列。例如,您想通过列中显示的属性的PropertyInfo来标识它们,或者通过在此列中显示其值的数据库列的数据库列名来标识它们。

在面向对象的编程中,如果要创建一种特殊的DataGridViewColumn,则应编写一个派生类:

class MySpecialDataGridViewColumn : DataGridViewColumn
{
    public string DatabaseColumnName {get; set;}
}

通常这就足够了:只要确保仅将MySpecialDataGridViewColumn个对象添加到DataGridView中即可。提取列时,将其类型转换为MySpecialDataGridViewColumn

var theColumnThatDisplaysFirstName = myDataGridView.Columns    // get all columns
       .Cast<MySpecidalDataGridViewColumn>()                   // cast to your type
       .Where(column => column.DatabaseCollumnName == "FirstName")
       .SingleOrDefault();                                     // keep the ones with "FirstName"

请注意,其他人仍然可以向您的DataGridView添加其他类型的列。如果您担心此问题,请确保将成员保持私有状态,并向“添加/提取/删除MySpecialDataGridViewColumns”添加功能。

如果您的DataGridView将被许多人使用,请考虑创建一个包含私有UserControl的{​​{1}},并具有向其中添加/检索/删除DataGridView对象的功能用户控件。这样,其他人就不会通过添加其他类型的列来滥用您的`DataGridView

当然,如果要允许其他人添加自己的列,则可以始终使用MySpecialDataGridViewColumn而不是OfType<MySpecialDataGridViewColumn>。这样,您就可以忽略其他类型的已添加列,您可以确定它们不会显示数据库列