我正在使用数据源用数据填充datagridview。但是,我试图找到一种方法让用户能够隐藏他不想看到的列。
我可以在程序运行之前隐藏和显示列:
[Browsable(false)]
public string URL
{
get
{
return this._URL;
}
set
{
this._URL = value;
this.RaisePropertyChnaged("URL");
}
}
我似乎无法弄清楚如何在运行时更改[Browsable(false)]
。
我有什么想法可以做到这一点?
基本上,我想将“开/关”绑定到菜单。
道歉,如果我在解释我的问题时没有使用正确的术语,我几周前自学并开始 - 所以还是非常新手:)
编辑:
无法隐藏列,因为当我运行更新功能时,所有列都会再次出现。这是我的更新功能:
private void UpdateResults()
{
Invoke(new MethodInvoker(
delegate
{
this.dgvResults.SuspendLayout();
this.dgvResults.DataSource = null;
this.dgvResults.DataSource = this._mySource;
this.dgvResults.ResumeLayout();
this.dgvResults.Refresh();
}
));
}
答案 0 :(得分:1)
在运行时,您只需将列指定为不可见:
dgv.Columns["ColumnName"].Visible = false;
答案 1 :(得分:0)
事实上,正如其他人提到BrowsableAttribute
的目的不同,但我明白你想做什么:
假设我们想创建一个UserControl而不是包装DataGridView
,并让用户能够选择要显示的列,从而允许完整的运行时绑定。一个简单的设计就是这样(我使用的是ToolStrip
,但如果你想要的话,你可以随时使用MenuStrip
:
private void BindingSource_ListChanged(object sender, ListChangedEventArgs e) {
this.countLabel.Text = string.Format("Count={0}", this.bindingSource.Count);
this.columnsToolStripButton.DropDownItems.Clear();
this.columnsToolStripButton.DropDownItems.AddRange(
(from c in this.dataGrid.Columns.Cast<DataGridViewColumn>()
select new Func<ToolStripMenuItem, ToolStripMenuItem>(
i => {
i.CheckedChanged += (o1, e2) => this.dataGrid.Columns[i.Text].Visible = i.Checked;
return i;
})(
new ToolStripMenuItem {
Checked = true,
CheckOnClick = true,
Text = c.HeaderText
})).ToArray());
}
在这种情况下,bindingSource
是DataSource
个实例的中间dataGrid
,我正在回复bindingSource.ListChanged
中的更改。
答案 2 :(得分:0)
在运行时正确的方法是在集合上提供自定义ITypedList实现,或者为类型提供TypeDescriptionProvider,或者(对于单对象绑定,而不是列表),实现ICustomTypeDescriptor。此外,您需要提供自己的过滤PropertyDescriptor实现。是不是真的值得吗?在大多数情况下:没有。通过简单地选择要添加的列,可以更加轻松地正确配置网格,显示(或不显示)相应的列。