2

データソースを使用して、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();
                       }
                       ));
    }
4

3 に答える 3

1

実行時に、列を非表示として指定するだけです。

dgv.Columns["ColumnName"].Visible = false;
于 2012-08-15T14:26:47.120 に答える
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であり、 の変更に対応しています。dataGridbindingSource.ListChanged

于 2012-08-15T14:36:55.600 に答える
0

実行時にこれを適切に行う方法は、コレクションにカスタム ITypedList 実装を提供するか、型に TypeDescriptionProvider を提供するか、(リストではなく単一オブジェクト バインディングの場合) ICustomTypeDescriptor を実装することです。さらに、独自のフィルタリングされた PropertyDescriptor 実装を提供する必要があります。それは本当に価値がありますか?ほとんどの場合: いいえ。追加する列を選択するだけで、適切な列を表示 (または非表示) して、グリッドを適切に構成する方がはるかに簡単です。

于 2012-08-15T14:39:09.780 に答える