2012-08-15 51 views
2

我正在使用数据源来填充我的datagridview数据。然而,即时通讯试图找到一种方式让用户能够隐藏他不想看到的列。在运行时Browsable(false)?

我可以隐藏和显示列在程序运行使用前:

[Browsable(false)] 
public string URL 
{ 
    get 
    { 
     return this._URL; 
    } 
    set 
    { 
     this._URL = value; 
     this.RaisePropertyChnaged("URL"); 
    } 
} 

我似乎无法弄清楚如何在运行时更改的[Browsable(false)]

任何想法我可以做到这一点?

基本上,我想绑定一个“开/关”菜单。

道歉,如果IM解释我的问题,当使用不正确的术语,我是自学的,开始在几个星期前 - 所以还是很菜鸟:)

编辑:

广东话隐藏的列,因为当我运行我的更新功能,所有的列再次出现。这里是我的更新功能:

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

正如一个注释,你有一个拼写错误:'this.RaisePropertyChnaged(“URL”);' – 2012-08-15 14:25:01

+0

Ops!没有注意到,谢谢:) – gwenda 2012-08-15 14:25:34

回答

1

在运行时,你可以指定列无形之中:

dgv.Columns["ColumnName"].Visible = false; 
+0

问题是,当我再次更新datagridview的列将再次出现可见 – gwenda 2012-08-15 14:27:22

+0

@gwenda你如何更新它导致这种情况发生?使用更新的代码更新您的问题。我相信你可能犯了错误,并导致它不尊重'可见' – 2012-08-15 14:28:23

+0

用我的功能更新它 – gwenda 2012-08-15 14:30:41

0

事实上,正如其他人不得不提的BrowsableAttribute的目的是不同的,但我明白你想要做什么:

假设我们想要创建一个UserControl,而不是包装一个DataGridView,并让用户能够选择显示哪些列,从而允许完整的运行时绑定。一个简单的设计会是这样(我使用ToolStrip,但你可以随时使用MenuStrip如果这就是你想要的):

enter image description here

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是中介DataSourcedataGrid实例,并且我正在响应bindingSource.ListChanged中的更改。

0

做到这一点正确在运行时的方式是提供对收集自定义ITypedList实现,或者该类型提供TypeDescriptionProvider,或(单对象的绑定,而不是表),以实现ICustomTypeDescriptor。另外,您需要提供您自己的过滤PropertyDescriptor实现。是不是真的值得吗?在大多数情况下:不。正确配置网格要简单得多,通过简单地选择要添加的网格来显示(或不显示)适当的列。