2013-02-04 1 views
0

DataGridView가있는 양식이 있습니다. 특정 조건에 따라 프로그래밍 방식으로 단일 행 선택을 취소합니다 (Selectedfalse으로 설정). 그러나 그렇게 할 때 다른 행이 현재 선택되어 있으면 선택도 취소됩니다. DataGridView를 MultiSelect = false으로 설정했습니다. 사용자는 한 행만 선택할 수 있어야합니다.특정 DataGridViewRow의 선택을 해제해도 다른 모든 행이 선택 취소되는 이유는 무엇입니까?

어떤 행의 Selected 속성을 설정하면 행을 선택하여 행을 선택하여 이전에 선택한 행의 선택을 해제하는 것으로 보입니다. 사실 false으로 Selected 속성을 설정하면 해당 동작이 변경되지 않습니다. 이는 MultiSelectfalse으로 설정되고 SelectionModeFullRowSelect으로 설정된 경우에만 발생합니다.

현재 주소가 true 인 경우에만 속성을 설정하여 해결할 수 있습니다.

if (row.Selected) row.Selected = false; 

하지만 왜 이런 일이 발생하는지 알고 싶습니다. 그리고 SelectionMode가 FullRowSelect로 설정된 이유는 무엇입니까?

전체 예제는

다음 샘플 코드 완전한 동작하는 예제가 포함되어 있습니다. 생성자는 세 개의 행을 추가합니다. 버튼을 클릭하면 가운데 행의 선택이 취소됩니다. 그러나 버튼을 클릭하기 전에 어떤 행을 선택했는지에 관계없이 최종 결과는 선택된 행이없는 것입니다.

using System; 
using System.Windows.Forms; 

class MainForm : Form 
{ 
    static void Main() { Application.Run(new MainForm()); } 

    private DataGridView _dataGridView; 
    private Button _SelectButton; 

    public MainForm() 
    { 
     _dataGridView = new DataGridView 
     { ReadOnly = true, AllowUserToAddRows = false }; 
     _dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 
     _dataGridView.Dock = DockStyle.Fill; 
     _dataGridView.MultiSelect = false; 
     _dataGridView.Columns.Add(new DataGridViewColumn 
     { CellTemplate = new DataGridViewTextBoxCell() }); 
     _dataGridView.Rows.Add("1"); 
     _dataGridView.Rows.Add("2"); 
     _dataGridView.Rows.Add("3"); 
     Controls.Add(_dataGridView); 
     _SelectButton = new Button { Text = "Deselect middle row" }; 
     _SelectButton.Click += _SelectButton_Click; 
     _SelectButton.Dock = DockStyle.Bottom; 
     Controls.Add(_SelectButton); 
    } 

    void _SelectButton_Click(object sender, EventArgs e) 
    { 
     _dataGridView.Rows[1].Selected = false; 
    } 
} 

답변

0

나는 이상한 행동이라고 생각합니다. 다중 선택을 허용하면 예상대로 작동하지만 다중 선택을 허용하지 않으면 _dataGridView.ClearSelection;을 호출 한 것처럼 작동합니다. 내가 볼 수있는 유일한 해결책은 해당 행을 선택 해제하기 전에 해당 행이 선택되었는지 단순히 테스트하는 것입니다.

void _SelectButton_Click(object sender, EventArgs e) 
{ 
    if (_dataGridView.Rows[1].Selected) 
    { 
     _dataGridView.Rows[1].Selected = false; 
    }    
} 
+0

왜 이런 일이 발생하는지 설명하지 않지만 답변을 수락했습니다. 나는 더 좋은 대답을 찾아 내지 못할 것이다. – comecme

관련 문제