Подтвердить что ты не робот

Как скрыть столбец DataGridView при использовании пользовательского DataSource?

У меня есть небольшое приложение в С#, у него есть 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 заполняется правильными данными, но теперь я хочу скрыть столбец2. Я попытался добавить [Browsable(false)] над объявлением столбца, который скроет его, но мне также нужно получить доступ к значению столбца из кода, а когда я использую [Browsable(false)] и попытаюсь прочитать содержимое, которое оно действует, как если столбец не существовать. Если я его не использую, я могу прочитать столбец без проблем, но это видно в DataGridView.

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

4b9b3361

Ответ 1

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

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

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

 [System.ComponentModel.Browsable(false)]

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

 public class Company
 {
     ...
     [System.ComponentModel.Browsable(false)]
     virtual public MyImageClass Logo { get; set;}

Ответ 2

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

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

dataGridView1.Columns[0].Visible = false;

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

object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"];

Ответ 3

Я заметил, что если использовать пропорционально это делает неполным (вся форма просто не "рисует" что-либо), если используется до 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

Ответ 4

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

ех..

     if (dt.Rows.Count > 0)
    {
        dataGridViewProjects.DataSource = dt;
        dataGridViewProjects.Columns["Title"].Width = 300;
        dataGridViewProjects.Columns["ID"].Visible = false;
    }

Ответ 5

Задайте этот столбец Visible property = false

dataGridView[ColumnName or Index].Visible = false;

Edit извините, пропустил свойство Columns dataGridView.Columns[ColumnName or Index].Visible = false;

Ответ 6

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

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

    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;
    }
}

Ответ 7

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

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

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