2010-12-16 13 views
18

Wie kann ich einige Zellen in DataGridView nicht auswählbar machen?DataGridView: Wie man einige Zellen auswählbar macht?

Mit 'nicht auswählbar' meine ich: Es kann in keiner Weise ausgewählt werden und der Versuch, es auszuwählen, hebt keine andere Zelle auf.

Ich meine nicht ReadOnly. Meine Zellen haben diese Eigenschaft bereits als wahr.

DataGridView.MultiSelect muss falsch sein.

Dank JYL Antwort schrieb ich einen Code:

private int selectedCellRow = 0; 
    private int selectedCellColumn = 0; 

    private void grid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e) 
    { 
     if (e.Cell == null || e.StateChanged != DataGridViewElementStates.Selected) 
       return; 

     if (e.Cell.RowIndex == 0 || e.Cell.ColumnIndex == 0 || e.Cell.RowIndex == 1 && e.Cell.ColumnIndex == 1) 
     { 
      e.Cell.Selected = false; 
      grid.Rows[selectedCellRow].Cells[selectedCellColumn].Selected = true; 
     } 
     else 
     { 
      selectedCellRow = e.Cell.RowIndex; 
      selectedCellColumn = e.Cell.ColumnIndex; 
     } 

     //this was only for seeing what is happening 
     //this.Text = selectedCellRow + " " + selectedCellColumn; 
    } 

Aber dies führt zu Stackoverflow. Welchen Zustand und wo muss ich hinstellen, um das zu verhindern?

+0

Meinst du nicht editierbar? Wie einige der Zellen sind schreibgeschützt? –

Antwort

14

Die Bedingung hinzugefügt und kommentiert, nach der Sie gefragt haben.

private int selectedCellRow = 0; 
private int selectedCellColumn = 0; 

private void grid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e) 
{ 
    if (e.Cell == null || e.StateChanged != DataGridViewElementStates.Selected) 
     return; 

    //if Cell that changed state is to be selected you don't need to process 
    //as event caused by 'unselectable' will select it again 
    if (e.Cell.RowIndex == selectedCellRow && e.Cell.ColumnIndex == selectedCellColumn) 
     return; 

    //this condition is necessary if you want to reset your DataGridView 
    if (!e.Cell.Selected) 
     return; 

    if (e.Cell.RowIndex == 0 || e.Cell.ColumnIndex == 0 || e.Cell.RowIndex == 1 && e.Cell.ColumnIndex == 1) 
    { 
     e.Cell.Selected = false; 
     grid.Rows[selectedCellRow].Cells[selectedCellColumn].Selected = true; 
    } 
    else 
    { 
     selectedCellRow = e.Cell.RowIndex; 
     selectedCellColumn = e.Cell.ColumnIndex; 
    }  
} 
+0

Das funktioniert :). Thanx –

+0

Eine leichte Verbesserung könnte darin bestehen, auf das aufrufende DataGridView über 'e.Cell.DataGridView' zu verweisen und nicht' grid' zu verwenden. In beiden Fällen benötigt das Ereignis über die ausgewählten Spalten- und Zeilenindizes eine "Hilfe von außen". Nette Lösung. –

6

Sie können das Ereignis "CellStateChanged" verwenden.

private void DataGridViewXYZ_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e) 
{ 
       if (e.Cell == null 
        || e.StateChanged != DataGridViewElementStates.Selected) 
        return; 
       if (! [condition here : can this cell be selectable ?]) 
        e.Cell.Selected = false; 
} 

EDIT: Wenn Sie die Multiselect-Eigenschaft Gridview auf True verlassen, können Sie sich eine „single wählen“ gridview mit unselectable Zellen verwalten: il die Zelle wählbar ist, deaktivieren Sie das andere Auswahl ...

+0

Ich glaube, dies würde verhindern, dass die Zelle ausgewählt wird, verhindert aber nicht, dass die vorherige Zelle aus der Auswahl genommen wird. –

+0

Sehen Sie meine Bearbeitung ... Es ist ziemlich einfach, dies zu tun. – JYL

+0

Mit Multiselect zu true haben Sie kein Problem mit meinem Code ... weil Multiselect zu true eine Zelle nicht abwählen wird, wenn Sie auf eine andere klicken. BEARBEITEN: Ihr allgemeiner Zustand ist in meinem Beispiel vorhanden ... – JYL

Verwandte Themen