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

Столбец ID DataGridView не будет скрыт

У меня есть DataGridView, привязанный к объекту ObjectDataSource, некоторые из столбцов скрыты, включая столбец идентификаторов. Проблема в том, что столбец идентификатора появляется даже тогда, когда его видимое свойство установлено в false. Кто-нибудь сталкивался с этой проблемой раньше? Установка ширины в ноль не является опцией, так как сетка не позволяет столбцам шириной не более 5 пикселей, поэтому она по-прежнему показывает столбец на сетке независимо от того, что.

Странно, что столбец ID не всегда показывался. После того, как я немного поработал над приложением, столбцы снова появились.

DataGridView не настроен на автоматическое создание столбцов. Я создаю версию 4.0.NET и С#.

Вот код в конструкторе формы.

dgvActiveMiners.AutoGenerateColumns = false;
dgvAvilableMiners.AutoGenerateColumns = false;
dgvOperationResults.AutoGenerateColumns = false;

dgvActiveMiners.Columns["dgvActiveMinersRecordId"].Visible = false;
dgvAvilableMiners.Columns["dgvAvilableMinersRecordId"].Visible = false;
dgvOperationResults.Columns["dgvOperationResultRecordId"].Visible = false;

Это сгенерированный код для сеток.

this.dgvOperationResults.AllowUserToAddRows = false;
this.dgvOperationResults.AllowUserToDeleteRows = false;
this.dgvOperationResults.AutoGenerateColumns = false;
this.dgvOperationResults.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvOperationResults.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.dgvOperationResultRecordId,
this.nameDataGridViewTextBoxColumn2,
this.typeIdDataGridViewTextBoxColumn,
this.amountDataGridViewTextBoxColumn,
this.operationIdDataGridViewTextBoxColumn});
this.dgvOperationResults.DataSource = this.operationResultBindingSource;
this.dgvOperationResults.Location = new System.Drawing.Point(12, 40);
this.dgvOperationResults.MultiSelect = false;
this.dgvOperationResults.Name = "dgvOperationResults";
this.dgvOperationResults.ReadOnly = true;
this.dgvOperationResults.Size = new System.Drawing.Size(498, 247);
this.dgvOperationResults.TabIndex = 16;

Я не знаю, что еще мне не хватало?

Спасибо!

4b9b3361

Ответ 1

Предложение 1:
Попробуйте явно установить для свойства DGV Column Visible значение false в событии FormLoad:

dataGridView.Columns["YourIdColumn"].Visible = false;

Предложение 2:
Попробуйте изменить столбец dgvActiveMinersRecordId из первого столбца в DGV до последнего столбца.

Ответ 2

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

Это кажется ошибкой, но работа вокруг:

Убедитесь, что столбцы, которые вы хотите скрыть, отображаются последними

Это будет зависеть от вашего кода, но для некоторых это будет:

  • Код SQL изменен для возврата столбцов позже
  • Измените код, который добавляет столбцы datagridview, помещая столбцы "скрыть" в конце.
  • Установка Columns[x].DisplayIndex, чтобы столбцы отображались последними, в соответствии с сообщением @Steve

Ответ 3

Может быть, немного поздно, но я избивал себя той же проблемой, у меня было две отдельные формы с DataGridViews, привязанные к различным DataTables. У одного не было проблем скрыть 1-й столбец, а с другой, все, что я пробовал, не срабатывало, до...

Примечание: [ "newCol" ] - это первый столбец (например, столбец 0) в таблице данных.

Этот код Fails скрывает столбец [0] (или по имени [ "NewRow" ])

...
MyDataGridView.DataSource = MyDatatable;
MyDataGridView.Columns["NewRow"].Visible = false;   // doesn't hide (col 0)
// MyDataGridView.Columns[0].Visible = false;  <<<< this didn't work either
MyDataGridView.Columns["Changed"].Visible = false;
MyDataGridView.Columns["Active"].Visible = false;
MyDatatable.RowFilter = "[Active] = 1";
...

этот код работает:

...
MyDataGridView.DataSource = MyDatatable;
MyDatatable.RowFilter = "[Active] = 1";
MyDataGridView.Columns["NewRow"].Visible = false;   // YAY!! Now it hides
// MyDataGridView.Columns[0].Visible = false;       <<<< and this works too
MyDataGridView.Columns["Changed"].Visible = false;
MyDataGridView.Columns["Active"].Visible = false;
...

Определите разницу? Здесь, где я указываю RowFilter.

В другой форме нет стартового RowFilter, но в обеих формах я позже изменяю RowFilter (в зависимости от действий пользователя), столбец 0 никогда не возвращается.

Кажется, слишком рано указывается RowFilter, после того как скрытые столбцы терпят неудачу для столбца 0.

Очень странно!!!! Очень расстраивает!!!!

Ответ 4

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

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

dataSelected.Columns["id"].Visible = false;

У меня не было этой проблемы, пока я не установил DisplayIndex в столбце

dataSelected.Columns["ipagenum"].DisplayIndex = 6;

Перемещение оскорбительных столбцов DisplayIndex до конца исправлено.

dataSelected.Columns["id"].DisplayIndex = 15;

Ответ 5

Я хотел бы внести вклад, который не упоминался.

Каждый столбец DataGridView имеет имя свойства. Вы можете напрямую обращаться к столбцу по имени, так как вы должны обращаться к любому другому элементу. Например: ColumnName.Property = AnyProperty. В вашем случае: ColumnName.Visible = false.

Я думаю, что он более чистый, более прямой и с меньшей вероятностью совершит ошибку. Мы также немного помогаем компилятору:)

Таким образом, нет необходимости использовать имя свойства DataGridView, не найти нужный столбец, опосредующий строку (которая потенциально может быть совершена ошибка). Я имею в виду это: YourDataGridView.Columns [ "YourColumn" ] Свойство = AnyProperty.

Ответ 6

Это нечетное.

Вы уверены, что вызываете правильное имя столбца? Я понимаю, что это была бы глупая ошибка, но это случается!

Вот простой тест, который вы можете попробовать:

void test(string columnName, bool visibility) {
  if (dataGridView1.Columns.Contains(columnName)) {
    dataGridView1.Columns[columnName].Visible = visibility;
  } else {
    throw new Exception(string.Format("Column '{0}' does not exist in DataGridView '{1}'.", columnName, dataGridView1.Name));
  }
}

Ответ 7

У меня была такая же проблема, и ни одно из вышеперечисленных не работало для меня. Мое исправление заключалось в том, чтобы установить DataPropertyName, по крайней мере, для столбца, который должен быть скрыт в дизайнере в "Редактировать столбцы".

Ответ 8

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

Ответ 9

У меня была такая же проблема, и мне не хотелось менять индекс моего столбца id на видимое свойство. Поэтому я заметил, что после того, как я указал, что column visible = false id column visible = false, я удалял последнюю строку DataGridView, и это то, что создавало столбец идентификаторов. Поэтому сначала удаляю строку, а затем указываю, что column = false id column = false.