在运行时可浏览(错误)?

时间:2012-08-15 14:22:45

标签: c# datagridview

我正在使用数据源用数据填充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();
                       }
                       ));
    }

3 个答案:

答案 0 :(得分:1)

在运行时,您只需将列指定为不可见:

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

答案 1 :(得分: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());
    }

在这种情况下,bindingSourceDataSource个实例的中间dataGrid,我正在回复bindingSource.ListChanged中的更改。

答案 2 :(得分:0)

在运行时正确的方法是在集合上提供自定义ITypedList实现,或者为类型提供TypeDescriptionProvider,或者(对于单对象绑定,而不是列表),实现ICustomTypeDescriptor。此外,您需要提供自己的过滤PropertyDescriptor实现。是不是真的值得吗?在大多数情况下:没有。通过简单地选择要添加的列,可以更加轻松地正确配置网格,显示(或不显示)相应的列。