使用自定义数据源时如何隐藏 DataGridView 的列?
Posted
技术标签:
【中文标题】使用自定义数据源时如何隐藏 DataGridView 的列?【英文标题】:How to hide column of DataGridView when using custom DataSource? 【发布时间】:2011-10-21 02:29:37 【问题描述】:我有一个 C# 中的小应用程序,它有一个 DataGridView,它使用以下方法填充:
grid.DataSource = MyDatasource array;
MyClass 包含列的结构,它看起来像这样:
class MyDatasource
private string column1;
private string column2;
public MyDatasource(string arg1, string arg2)
this.column1 = arg1;
this.column2 = arg2;
public string column1
get
return this.column1;
set
this.column1 = value;
public string column2
get
return this.column2;
set
this.column1 = value;
一切正常,DataGridView 填充了正确的数据,但现在我想隐藏 column2。我尝试在列声明上方添加[Browsable(false)]
,这将隐藏它,但我还需要从代码中访问列值,当我使用[Browsable(false)]
并尝试读取内容时,它的行为就像列没有存在。如果我不使用它,我可以毫无问题地读取该列,但它在 DataGridView 中可见。
如何隐藏列但仍能从代码中读取其内容?
【问题讨论】:
【参考方案1】:尝试关注:
DataGridView1.Columns["YourColumnName"].Visible = false;
【讨论】:
【参考方案2】:如果您想使用 BrowsableAttribute,那么您可以在运行时在模型上查找它并相应地隐藏该列:
private void Form_Load(object sender, EventArgs e)
//add this line after your DataGridView initialization
HideColumns<MyModel>(myDvg);
private void HideColumns<T>(DataGridView dvg)
var type = typeof(T);
foreach (var column in dvg.Columns.Cast<DataGridViewColumn>())
column.Visible = IsBrowsable(type.GetProperty(column.Name));
private bool IsBrowsable(PropertyInfo propertyInfo)
var attribute = propertyInfo.GetCustomAttributes(true).FirstOrDefault(att => att.GetType() == typeof(BrowsableAttribute));
return attribute == null || (attribute as BrowsableAttribute).Browsable;
【讨论】:
【参考方案3】:MyDataGridView.RowHeadersVisible = False; 在绑定和重命名每个列标题并设置列宽之前。 在我搜索时帮助我记忆失败,因为我会搜索......这是肯定的;-)
【讨论】:
【参考方案4】:只需设置DataGridView.AutoGenerateColumns = false
;
你需要点击右上角的箭头(datagridview
)来添加列,在DataPropertyName
你需要把你的属性的名字放在你的类中。
然后,在datagridview
中定义列后,您可以设置datagridview.datasource = myClassViewModel
。
【讨论】:
".....您需要在您的班级中输入您的财产的名称。"....我发布:“您需要在班级中输入相同的财产名称。 ..." 如果我的班级有公共字符串名称 get;set; 那么你的 DataPropertyName 在列中应该有 "name" 值。【参考方案5】:我注意到,如果以编程方式使用它会呈现不完整(整个表单根本不会“绘制”任何东西)如果在panel1.Controls.Add(dataGridView);
之前使用,那么dataGridView.Columns["ID"].Visible = false;
将破坏整个表单并将其变为空白,所以为了解决这个问题在 EG 之后设置:
panel1.Controls.Add(dataGridView);
dataGridView.Columns["ID"].Visible = false;
//works
dataGridView.Columns["ID"].Visible = false;
panel1.Controls.Add(dataGridView);
//fails miserably
【讨论】:
【参考方案6】:我遇到了同样的问题
这是可能对您有用的解决方案。它对我有用
GridView1.DataBind();
if (GridView1.Columns.Count > 0)
GridView1.Columns[0].Visible = false;
else
GridView1.HeaderRow.Cells[0].Visible = false;
foreach (GridViewRow gvr in GridView1.Rows)
gvr.Cells[0].Visible = false;
【讨论】:
【参考方案7】:在某些情况下,先将列添加到 DataGridView 然后隐藏它可能是个坏主意。
例如,我有一个类,该类具有用于公司徽标的 Image 属性的 NHibernate 代理。如果我访问该属性(例如,通过调用其 ToString 方法以在 DataGridView 中显示该属性),它将从 SQL 服务器下载图像。如果我有一个 Company 对象列表并将其用作 DataGridView 的数据源,那么(我怀疑)它会在我隐藏该列之前下载所有徽标。
为了防止这种情况,我使用了自定义属性
[System.ComponentModel.Browsable(false)]
在图像属性上,以便 DataGridView 忽略该属性(不创建列并且不调用 ToString 方法)。
public class Company
...
[System.ComponentModel.Browsable(false)]
virtual public MyImageClass Logo get; set;
【讨论】:
如果您使用的是您知道永远不想展示的房产,这绝对是最好的方式。 这是最好的答案。期间。 我以前在 Windows 窗体上使用过它,但不幸的是它不适用于 WPF 我会说那是 WPF 中的一个错误。我似乎记得几年前微软考虑停止 WPF - 因为那个我从来没有进入 WPF...【参考方案8】:我不确定是否为时已晚,但问题是,如果您在运行时绑定,则无法在设计模式下设置列。因此,如果您在运行时绑定,请继续并从设计模式,务实地去做
例如..
if (dt.Rows.Count > 0)
dataGridViewProjects.DataSource = dt;
dataGridViewProjects.Columns["Title"].Width = 300;
dataGridViewProjects.Columns["ID"].Visible = false;
【讨论】:
【参考方案9】:您必须在网格视图控件而不是数据源中隐藏列。将其隐藏在数据源中,它根本不会呈现到网格视图,因此您将无法访问网格视图中的值。按照您建议的方式进行操作,您必须通过数据源而不是网格视图访问列值。
要隐藏网格视图控件上的列,可以使用如下代码:
dataGridView1.Columns[0].Visible = false;
要从数据源访问该列,您可以尝试如下操作:
object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"];
【讨论】:
控件创建后'Visible'为“ReadOnly”。【参考方案10】:设置该特定列的 Visible
属性 = false
dataGridView[ColumnName or Index].Visible = false;
编辑
抱歉错过了Columns
属性
dataGridView.Columns[ColumnName or Index].Visible = false;
【讨论】:
以上是关于使用自定义数据源时如何隐藏 DataGridView 的列?的主要内容,如果未能解决你的问题,请参考以下文章
使用 AWS CloudFront 时,如何向公众隐藏自定义源服务器?