2013-08-22 2 views
1

두 개의 확인란 열이있는 DataGridView이 있습니다. 두 행의 행이 모두 선택되면 체크 표시를 지우려고합니다. 그리드는 DataTable에서 채워집니다. 그것은 다음과 같이 작동즉시 DataGridView 셀 값 새로 고침

, 나는 즉시 초점 체크 박스를 클릭하지 않을 경우 손실 후 CellValueChanged 이벤트를 발생하는 코드를 수정 한 this 당으로
if (bothColumnsAreChecked) 
{ 
    DataRow first = SelectedFirstItems.First(); 
    DataRow second = SelectedSecondItems.First(); 

    // stuff... 

    first["IsCheckedFirst"] = false; 
    second["IsCheckedSecond"] = false; 
} 

:

void brandsGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) 
{ 
    brandsGridView.CommitEdit(DataGridViewDataErrorContexts.Commit); 
} 

문제는, 그 이후 체크 표시를 지우면 행 중 하나가 선택됩니다 (이 행의 확인란을 방금 클릭했기 때문에).이 행의 체크 표시는 여전히 표시됩니다. 행을 선택 취소 할 때까지 사라지지 않습니다. 어떻게해야합니까? 나는 시도했다 :

1) Refresh() 그리드에. 쓸데없이; 모눈은 새로 고쳐지지만 커서를 이동하기 전에 다시 그려지지 않습니다.

2) CommitEdit()EndEdit(). 이렇게해도 마지막으로 선택한 확인란이 지워지지 않습니다.

어떻게해야합니까?

편집 : 설명하는 것이 좋지 않습니다. 다음은 간단한 연습입니다.

두 개의 확인란 열 (c1 및 c2)이 있습니다.

1) 행 r1에서 c1을 클릭합니다. c1이 확인되고 r1이 선택됩니다.

2) 행 r2 (또는 r1)에서 c2를 클릭합니다. c2가 선택되고 r2가 선택됩니다.

3) c1 및 c2가 이제 지워집니다 (체크 박스 정보를 어딘가에 기록한 후).

문제는 r1의 c1에서 청크가 사라지지만 r2의 포커스가 사라질 때까지 r2의 체크 상자에 그대로 남아 있다는 점입니다.

희망이 있습니다.

+0

나는 이해할 수 없다. DataGridview에서 행을 선택하고 일부 열 (내가 작성한 것으로 가정 한 것)에 체크 표시가있는 것은 2 가지입니다. 무엇을 성취하려고합니까? 사라지거나 정확히 무엇을 선택합니까? – Tarec

+0

확인란을 클릭하면 확인란이있는 행이 선택됩니다. 선택이 사라질 수도 있고 그렇지 않을 수도 있습니다. 중요하지 않습니다. 내가하고 싶은 것은 체크 박스를 지운 후에 그리드를 다시 그려서 체크 표시가없는 것이다. –

+0

@JohnNoCookies '체크 박스 지우기'가 무슨 뜻인지 이해가 안됩니까? 당신이 직접 그렸고 그것을 지우고 싶습니까? 아니면 '체크 박스를 선택 취소 하시겠습니까?'라는 뜻입니까? –

답변

0

지금은 조금 더 분명합니다.

DataGridView dg = new DataGridView(); 
DataTable dt = GetDataTable(); 
dg.DataSource = dt; 
:
brandsGridView.ClearSelection(); 
+0

행을 선택 취소하지만 체크 표시가 그대로 유지됩니다. –

+0

네,하지만 두 번째 행이 여전히 선택되어 있기 때문에 하나의 체크 표시가 선택 해제되는 이유는 같기 때문에 제공 한 방법의 체크 박스를 선택 취소하기 전에 선택을 취소 할 수 있습니다. – Tarec

0

내가 easies의 방법은 처음처럼이 DataGridView에 바인딩을 설정하는 것입니다 생각 후 그건 당신이있어 거라면 당신은 항상 DGV의 행을 선택 해제 할 수 있지만 나도 몰라

그리고 새로 고침 할 때 다시 바인딩을 설정하십시오. 그래, 나는 그것이 더러운 해킹 방법임을 깨닫는다. 그러나 그것은 가장 쉽다.

DataTable dt = GetDataTable(); 
dg.DataSource = dt; 

올드 답 : 은 당신이 그것에 대해 BindingGroup을 사용할 수 생각 : http://msdn.microsoft.com/en-us/library/system.windows.data.bindinggroup.aspx

+1

'BindingGroup'은'Winforms'가 아니라'WPF' 물건입니다 : P –

0

나는 매우 비슷한 문제가 있었다. (음, 다른 컨텍스트이지만 문제는 동일했습니다.)

많은 노력과 읽기 끝에이 문제와 관련된 스레드가 있었지만 해결책을 찾았습니다. 약간 기초가 있지만 그것은 나를 위해 일합니다.

문제는 포커스가있는 DataGridView과 관련이 있습니다. 그래서 다른 컨트롤 (예 : 버튼)에 일시적으로 초점을 변경하고 다음과 같이 될 수 다시 경우에 DataGridView

에 그것을 가져 :

button1.focus(); 
if (bothColumnsAreChecked) 
{ 
    DataRow first = SelectedFirstItems.First(); 
    DataRow second = SelectedSecondItems.First(); 

    // stuff... 

    first["IsCheckedFirst"] = false; 
    second["IsCheckedSecond"] = false; 
} 
brandsGridView.focus(); 

내가 도울 수 있기를 바랍니다. 그러나 누군가가 왜 이런 일이 일어나고 있는지 더 나은 해결책이나 자세한 설명을 발견하면. 매우 높이 평가 될 것입니다.

관련 문제