Как скрыть столбец DataGridView при использовании пользовательских DataSource? - PullRequest
26 голосов
/ 05 августа 2011

У меня есть небольшое приложение на 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.

Как я могу скрыть столбец, но при этом иметь возможность читать его содержимое из кода?

Ответы [ 7 ]

40 голосов
/ 18 января 2013

В некоторых случаях может быть плохой идеей сначала добавить столбец в DataGridView, а затем скрыть его.

Например, у меня есть класс с прокси-сервером NHibernate для свойства Image для логотипов компании. Если бы я получил доступ к этому свойству (например, вызвав его метод ToString, чтобы показать это в DataGridView), он загрузил бы изображение с сервера SQL. Если бы у меня был список объектов Company и я использовал бы его в качестве источника данных DataGridView, то (я подозреваю) он загрузил бы ВСЕ логотипы ДО того, как я смог скрыть столбец.

Чтобы предотвратить это, я использовал пользовательский атрибут

 [System.ComponentModel.Browsable(false)]

для свойства изображения, так что DataGridView игнорирует свойство (не создает столбец и не вызывает методы ToString).

 public class Company
 {
     ...
     [System.ComponentModel.Browsable(false)]
     virtual public MyImageClass Logo { get; set;}
39 голосов
/ 05 августа 2011

Вы должны скрыть столбец в элементе управления видом сетки, а не в источнике данных. Скрывая его в источнике данных, он вообще не будет отображаться в виде сетки, поэтому вы не сможете получить доступ к значению в виде сетки. Делая это так, как вы предлагаете, вам нужно будет получить доступ к значению столбца через источник данных, а не к сетке.

Чтобы скрыть столбец в элементе управления видом сетки, вы можете использовать код, подобный следующему:

dataGridView1.Columns[0].Visible = false;

Чтобы получить доступ к столбцу из источника данных, вы можете попробовать что-то вроде этого:

object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"];
6 голосов
/ 03 августа 2016

Я заметил, что если использовать его программно, он отдает неполное (вся форма просто ничего не «рисует»), если используется до 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
5 голосов
/ 10 декабря 2012

Я не уверен, что уже слишком поздно, но проблема в том, что вы не можете установить столбцы в режиме разработки, если вы связываете во время выполнения. Поэтому, если вы связываете во время выполнения, продолжайте и удалите столбцы изсоздай режим и сделай это прагматично

ex ..

     if (dt.Rows.Count > 0)
    {
        dataGridViewProjects.DataSource = dt;
        dataGridViewProjects.Columns["Title"].Width = 300;
        dataGridViewProjects.Columns["ID"].Visible = false;
    }
2 голосов
/ 05 августа 2011

Установить свойство Visible этого конкретного столбца = false

dataGridView[ColumnName or Index].Visible = false;

Редактировать Извините, пропущено свойство Columns dataGridView.Columns[ColumnName or Index].Visible = false;

1 голос
/ 15 апреля 2013

У меня была такая же проблема

Вот решение, которое может работать для вас.У меня это сработало

    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;
    }
}
0 голосов
/ 26 апреля 2019

Просто установите DataGridView.AutoGenerateColumns = false;

Вам нужно нажать на стрелку в правом верхнем углу (в datagridview), чтобы добавить столбцы, а в DataPropertyName вам нужно указать название вашей собственности вваш класс.

Затем, после того как вы определили свои столбцы в datagridview, вы можете установить datagridview.datasource = myClassViewModel.

...