Как скрыть столбец 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.
Как я могу скрыть столбец, но все же уметь читать его содержимое из кода?
Ответы
Ответ 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
.