it-swarm.com.ru

Как отключить возможность выбора в DataGridView?

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

Как я могу это сделать?

46
Mahdi Tahsildari

Я бы пошел с этим:

private void myDataGridView_SelectionChanged(Object sender, EventArgs e)
{
    dgvSomeDataGridView.ClearSelection();  
}

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

Установка ReadOnly = true в элементе управления не влияет на возможность выбора ячейки или строки. И есть визуальные и функциональные недостатки установки Enabled = false.

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

107
edhubbell

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

DataGridView.RowsDefaultCellStyle.SelectionBackColor = System.Drawing.Color.Transparent;
12
user4101525

Enabled свойство false

или же

this.dataGridView1.DefaultCellStyle.SelectionBackColor = this.dataGridView1.DefaultCellStyle.BackColor;
this.dataGridView1.DefaultCellStyle.SelectionForeColor = this.dataGridView1.DefaultCellStyle.ForeColor;
6
Ramgy Borja

Я исправил это, установив для свойства Enabled значение false.

2
Rick

Я обнаружил, что все свойства AllowUser... установлены на false, ReadOnly на true, RowHeadersVisible на false, ScollBars на None, а затем имитация предотвращения выбора работал лучше всего для меня. Если не установить для Enabled значение false, пользователь все равно сможет копировать данные из таблицы.

Следующий код также очищает внешний вид, когда вам нужна простая сетка отображения (при условии, что строки имеют одинаковую высоту):

int width = 0;
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
    width += dataGridView1.Columns[i].Width;
}

dataGridView1.Width = width;
dataGridView1.Height = dataGridView1.Rows[0].Height*(dataGridView1.Rows.Count+1);
1
SharpC

Это сработало для меня как шарм:

row.DataGridView.Enabled = false;

row.DefaultCellStyle.BackColor = Color.LightGray;

row.DefaultCellStyle.ForeColor = Color.DarkGray;

(где row = DataGridView.NewRow (соответствующие перегрузки);)

1
Paddy

Мне понравился ответ user4101525 лучше всего в теории, но на самом деле он не работает ... Выбор не является наложением, поэтому вы видите все, что находится под контролем

Ответ Рамги Борджи не касается того факта, что стиль по умолчанию вообще не является цветом, поэтому его применение не помогает…. Это обрабатывает стиль по умолчанию и работает, если применяются ваши собственные цвета (что может быть то, что относится к edhubbell). как неприятные результаты)

dgv.RowsDefaultCellStyle.SelectionBackColor = dgv.RowsDefaultCellStyle.BackColor.IsEmpty ? System.Drawing.Color.White : dgv.RowsDefaultCellStyle.BackColor;
dgv.RowsDefaultCellStyle.SelectionForeColor = dgv.RowsDefaultCellStyle.ForeColor.IsEmpty ? System.Drawing.Color.Black : dgv.RowsDefaultCellStyle.ForeColor;
0
Bengineer

Используйте свойство DataGridView.ReadOnly

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

Обратите внимание на эти настройки в примере кода:

// Set property values appropriate for read-only
// display and limited interactivity
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.AllowUserToOrderColumns = true;
dataGridView1.ReadOnly = true;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
dataGridView1.AllowUserToResizeColumns = false;
dataGridView1.ColumnHeadersHeightSizeMode = 
DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
dataGridView1.AllowUserToResizeRows = false;
dataGridView1.RowHeadersWidthSizeMode = 
DataGridViewRowHeadersWidthSizeMode.DisableResizing;
0
Angshuman Agarwal

вы должны создать собственный DataGridView

`

namespace System.Windows.Forms
{
    class MyDataGridView : DataGridView
    {
        public bool PreventUserClick = false;

        public MyDataGridView()
        {

        }
        protected override void OnMouseDown(MouseEventArgs e)
        {
            if (PreventUserClick) return;

            base.OnMouseDown(e);
        }
    }
}

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

затем перейдите к .Designer.cs и измените старый DataGridView на новый, не беспокоясь о предыдущем коде.

private System.Windows.Forms.DataGridView dgv; // found close to the bottom

...

private void InitializeComponent() {
    ...
    this.dgv = new System.Windows.Forms.DataGridView();
    ...
}

к (соответственно)

private System.Windows.Forms.MyDataGridView dgv;

this.dgv = new System.Windows.Forms.MyDataGridView();
0
Jannik Svensson