DataGridView только для чтения ячеек - PullRequest
13 голосов
/ 03 июня 2009

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

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

Ответы [ 8 ]

21 голосов
/ 03 июня 2009

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

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

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

this.dgridvwMain.Rows[index].Cells["colName"].ReadOnly = true;
3 голосов
/ 28 февраля 2014

Вы можете использовать событие 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
1 голос
/ 30 сентября 2015
this.dataGridViewEmpList.EditMode = DataGridViewEditMode.EditProgrammatically;
1 голос
/ 21 июня 2009

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

Но вы могли бы установить для свойства ячейки только для чтения значение true (согласно Рашми) для события RowEnter?

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

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

0 голосов
/ 23 октября 2018

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

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

xaml

<DataGrid BeginningEdit="DataGrid_BeginningEdit" ItemsSource="{Binding Example, Mode=TwoWay}"/>

c#:

private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    string content = (e.EditingEventArgs.Source as TextBlock).Text;

    if (!(String.IsNullOrEmpty(content)))
        e.Cancel = true;
}
0 голосов
/ 26 июня 2009

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

Тогда вы можете представить метку для чтения и текстовое поле для редактирования. Ярлыки не влияют на индекс вкладки.

<asp:TemplateColumn>
  <ItemTemplate>
<%
    if ( <%# Eval( "ReadOnlyFlag" ) %> )
    { 
%>
    <asp:Label Text="<%# Eval( "BoundColumn" ) %>" />
<%
    }
    else
    {
 %>
    <asp:Textbox Text="<%# Eval( "BoundColumn" ) %>" />
<%
    }
%>
    </ItemTemplate>
</asp:TemplateColumn>
0 голосов
/ 21 июня 2009

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

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

0 голосов
/ 03 июня 2009

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

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

        return;
    }

}

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

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...