2009-06-03 9 views
10

많은 양의 데이터가 포함 된 바인드 된 DataGridView가 있습니다. 문제는 일부 셀이 ReadOnly 여야하며 사용자가 셀간에 Tab 또는 Enter 키를 사용하여 탐색 할 때도 ReadOnly 셀을 무시해야한다는 것입니다. 어떤 특정 셀을로드 한 후 ReadOnly imediatly하게 만드는 가장 좋은 방법은 무엇입니까?DataGridView 읽기 전용 셀

DataSource를 설정 한 후에 셀을 루핑하는 것은 그리드에 많은 양의 데이터가 있다는 점을 고려하지 않는 것이 좋습니다. 또한 TAB 키를 사용하여 탐색 할 때 다음 셀이 ReadOnly인지 여부를 이미 알고 있기 때문에 CellEnter에서 셀 ReadOnly을 만들지 않습니다. 당신이 열 내의 개별 세포 위해 무엇을해야하는 경우

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

는, 당신은 루프가이처럼 설정됩니다 :

답변

17

봅니다 읽기 전용 데이터 바인딩 전에 열이 아닌 개별 셀을 만들려면 : 열이 읽기 전용되면

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

I는 열 내에서 세포의 일부는 읽기 전용 등하지 될 수 없습니다. 그것은 몇몇 깃발에 달려있다. –

+0

개별 열의 경우 루프를 반복하여 true로 설정해야합니다. 시간이 오래 걸리지 만 다른 대안은 없다고 생각합니다. –

+2

.ReadOnly = true - 예. 데이터 바인딩이 완료된 후에 수행해야합니다. 예 : DataGridView.DataBindingComplete 이벤트 처리기. – Boogier

0

...이 이벤트를 처리 할 수 ​​있습니다 (Rashmi의 응답을 참조)

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

     return; 
    } 

} 

다음 셀의 읽기 전용 속성을 가져옵니다.

감사합니다.

+0

동일한 열에있는 셀 중 일부는 ReadOnly 일 수 있고 다른 셀은 그렇지 않을 수 있기 때문에 열을 ReadOnly로 설정할 수 없습니다. 그것은 몇몇 깃발에 달려있다. –

+0

열심히 100 % 확신하지 못하면 ReadOnly 인 열은 내가 작성한 코드에도 영향을 미칩니다. 그것을 시도해 볼만한 가치가있을 수 있습니다 ... –

1

나는 이것을 시도하지 않았습니다.

그러나 RowEnter 이벤트에서 셀의 읽기 전용 속성을 true로 설정할 수 있습니다 (Rashmi에 따라)?

한 행에서 다른 행으로 이동할 때 (또는 셀 A1에서 B3으로 변경할 때) RowEnter 이벤트가 실행되어야한다고 생각합니다.

도움이 될까요?

-2

여기에 아주 좋은 샘플있다 :
http://blogs.msdn.com/netcfteam/archive/2006/04/25/583542.aspx

당신이 shouldn주의 같은에 있도록 당신은 단지 Paint()를 오버라이드 (override) 할 필요가

, 나는 셀 내용에 따라 배경색을 변경하는 컴팩트 프레임 워크에 사용했습니다 '는 읽기 전용으로 설정하는 데는 문제가 없습니다.

+2

-1 문제를 해결하는 잘못된 방법. – siride

+0

링크 만 응답은 게시 지침에 위배됩니다. 완전한 대답은 사용자가 문제를 해결하기 위해 다른 페이지로 이동할 필요가 없다는 것입니다. – orgtigger

-1

바운드 열 대신 템플릿 열을 사용하고 필드의 읽기 전용 조건을 사용할 수 있습니까?

그러면 읽기 전용 레이블과 편집 가능한 텍스트를 표시 할 수 있습니다. 탭은 탭 색인을 방해하지 않습니다.

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

ASP.NET에는 "DataGridView"가 없습니다 ... OP는 WinForms 응답을 요구하고 있습니다. –

4

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
this.dataGridViewEmpList.EditMode = DataGridViewEditMode.EditProgrammatically;