2010-03-16 12 views
7

Ich verwende eine DGV, um eine Liste von Bildern mit Textbeschriftungen als Auswahlliste anzuzeigen. Sie müssen immer eine einzige Auswahl in der Liste sein. Ich kann keine Möglichkeit finden, den Benutzer daran zu hindern, die Auswahl durch einen Mausklick auf die ausgewählte Zeile zu löschen.DataGridView, das immer eine Zeile ausgewählt hat

Gibt es eine Eigenschaft im Designer, die ich vermisse, die das tun könnte?

Wenn ich das Verhalten in den Mausklick-Ereignissen überschreiben muss, gibt es andere Möglichkeiten, wie der Benutzer die aktuelle Auswahl löschen könnte, die ebenfalls abgedeckt werden muss?

Gibt es einen dritten Ansatz, den ich nehmen könnte, der weniger umständlich ist als meine zweite Idee?

+0

Warum muss der Benutzer immer brauchen ausgewählte Artikel zu halten? Welche Art von Funktionalität ermöglicht das? –

+0

Aus demselben Grund muss immer eine Optionsschaltfläche ausgewählt sein. Ich benutze ein DGV, weil die Gesamtzahl der Auswahlen groß genug ist, um ohne Scrollen Akov (20 Wahlen x 20 Pixel hohe Bilder) zu sein. –

Antwort

2

Der einfachste Weg ist, das Ereignis SelectionChanged abzufangen und zu prüfen, ob der Benutzer alle Zeilen abgewählt hat. Ist dies der Fall, wählen Sie die zuvor ausgewählte Zeile erneut aus. Im Wesentlichen unterbrechen Sie ihre Aktion und wechseln die Auswahl zurück. So etwas wie dieser (Code nicht getestet, aber Sie werden auf die Idee kommen):

DataGridViewRow last_selected_row; 
    private void dgv_SelectionChanged(object sender, EventArgs e) 
    { 
      if (dgv.SelectedRows.Count == 0) 
        last_selected_row.Selected = true; 
      else 
        last_selected_row = dgv.SelectedRows[0]; 
    } 

Je nach Anwendung kann es besser sein, den Zeilenindex zu speichern, anstatt ein Verweis auf die Zeile selbst. Stellen Sie außerdem sicher, dass last_selected_row initialisiert und aktualisiert wird, wenn Sie Zeilen löschen.

Alle anderen Steuerelemente, die das Ereignis SelectionChanged haken, müssen den Fall, in dem keine Zeilen ausgewählt sind, sicher behandeln, falls sie vor dem Ereignis ausgelöst werden, das sie zurückschaltet. Sie können jedoch sofort zurückkehren, sicher in dem Wissen, dass SelectionChanged wieder kurzzeitig feuern wird.

Sie könnten auch DataGridView Unterklasse und überschreiben die -Methode. Dann können Sie die letzte ausgewählte Zeile vor das Ereignis erneut auslösen (es wird ausgelöst, wenn Sie base.OnSelectionChanged aufrufen).

0

Eine DGV hat eine Eigenschaft namens multiselect, wenn Sie sie auf false setzen, kann immer nur eine Zelle/Zeile ausgewählt werden.

+1

Das verhindert die Auswahl mehrerer Zeilen. IT hindert den Benutzer nicht daran, durch Klicken auf die ausgewählte Zeile die Auswahl zu löschen. –

0

Griff einfach das Databindingcomplete-Ereignis des Datagridview wie folgt aus:

private void datagridview1_DataBindingComplete(System.Object sender, System.Windows.Forms.DataGridViewBindingCompleteEventArgs e) 

{ 
datagridview1.ClearSelection(); 
} 
+0

Bitte lesen Sie meine Frage erneut. Ihre Lösung löscht alle vorhandenen Auswahlen, wenn das Raster geladen wird. Es hindert den Benutzer nicht daran, eine Auswahl zu löschen. –

Verwandte Themen