Ячейки только для чтения DataGridView

У меня есть связанный DataGridView, который содержит большой объем данных. Проблема в том, что некоторые ячейки должны быть ReadOnly, а также когда пользователь переходит с помощью TAB или ENTER между ячейками, ячейки ReadOnly следует обойти. Какой лучший способ сделать некоторые конкретные ячейки ReadOnly imediatly после загрузки?

Цитирование через ячейки после установки DataSource не является хорошей идеей, учитывая, что сетка имеет большой объем данных. Кроме того, создание ячейки ReadOnly на CellEnter не работает, потому что при навигации с помощью клавиши TAB мне уже нужно знать, является ли следующая ячейка ReadOnly или нет.

Ответ 1

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

this.dgrid.Columns["colName"].ReadOnly = true;

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

this.dgridvwMain.Rows[index].Cells["colName"].ReadOnly = true;

Ответ 2

Вы можете использовать событие CellBeginEdit и установить e.Cancel = True, когда вам нужно отключить ячейку.

Private Sub DataGridView_CellBeginEdit(sender As System.Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridViewMsg.CellBeginEdit
    If DataGridViewMsg.Rows(e.RowIndex).Cells("disable").Value = "Y" Then
        e.Cancel = True
    End If
End Sub

Ответ 3

Я не пробовал это.

Но вы можете установить свойство readonly ячейки в true (согласно Rashmi), на событие RowEnter?

Я предполагаю, что событие RowEnter должно срабатывать, когда вы переходите от одной строки к другой (или она должна быть изменена с ячейки A1 на B3).

Помогает ли это вообще?

Ответ 4

this.dataGridViewEmpList.EditMode = DataGridViewEditMode.EditProgrammatically;

Ответ 5

Как только столбец будет доступен только для чтения (см. ответ Rashmi), вы можете обработать это событие...

private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Tab)
    {
        Boolean readOnly = (sender as DataGridView).SelectedCells[0].ReadOnly;

        return;
    }

}

который получит следующее свойство чтения ячейки.

Спасибо

Ответ 6

Не могли бы вы использовать столбец шаблона вместо связанного столбца, тогда у вас есть условие для readonlyness этого поля?

Затем вы можете представить ярлык для readonly и текстовое поле для редактирования. Ярлыки не будут мешать индексу вашей вкладки.

<asp:TemplateColumn>
  <ItemTemplate>
<%
    if ( <%# Eval( "ReadOnlyFlag" ) %> )
    { 
%>
    <asp:Label Text="<%# Eval( "BoundColumn" ) %>" />
<%
    }
    else
    {
 %>
    <asp:Textbox Text="<%# Eval( "BoundColumn" ) %>" />
<%
    }
%>
    </ItemTemplate>
</asp:TemplateColumn>

Ответ 7

Здесь очень хороший пример:
http://blogs.msdn.com/netcfteam/archive/2006/04/25/583542.aspx

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