我正在编写一个程序,其中使用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年,所以我很难相信这样的事情从未实现。
请告诉我这是否可行!谢谢
答案 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>
。这样,您就可以忽略其他类型的已添加列,您可以确定它们不会显示数据库列