none
SelectedIndex after defaultview sort RRS feed

  • Frage

  • Hello everybody

    I am populating a datagrid with a defaultview of a datatable which has been sorted.

    ds.Tables("power").DefaultView.Sort = "deviceType_id ASC, device_id ASC, device_name ASC"
    

    In order to validate an input, I need to retrieve the datarow which has the current focus (selectionmode is full row). Therefore I use the code below:

    Dim dtRow As DataRow = ds.Tables("power").Rows(myDataGrid.SelectedIndex)
    

    The returned datarow is not the one I expected. I.e. the selection of the thrid row returns a selectedIndex of 7. Using the defaultview without sorting it, does the job. Selecting the third row returns the expected selectedindex.

    Does anybody can give me an idea how to handle this issue? I am in need to retrieve a cell value of the selected row and do some verification in the code behing (i. e. looking up an other datatable whether the ID of the currently selected record (item, row) exists there, too).

    I am really sucked here an appreciate any help.

    thanks,


    Michael Lutz, BITsoft
    Donnerstag, 13. Januar 2011 18:54

Antworten

  • Mit "ds.Tables("power").Rows(myDataGrid.SelectedIndex" greifst Du auf die unsortierte Ausgangsfolge zu. Im Grid wird aber IMMER eine Sicht zur Anzeige genutzt. Entweder Du bindest selbst eine Sicht oder diese Sicht wird implizit zum Zeitpunkt der Bindung erzeugt. Nach dem ersten Sortiervorgang explizit durch Deine Zuweisung und Bindung des “DefaultView” oder auch implizit z.B. nach Klick auf Spaltenkopf klappt der Zugriff natürlich nicht mehr. SelectedIndex zeigt auf die Datenzeile der Sicht und stimmt im Normalfall nicht mehr mit der Datenzeile in der unsortierten Folge überein. Abhilfe schaft der Zugriff über die genutzte Sicht, z,B. so bei Nutzung von DefaultView:
     
    Dim dtRow As DataRow = CType(ds.Tables("power").DefaultView.Item(myDataGrid.SelectedIndex), DataRowView).Row
     
    --
    Viele Grüße
    Peter
    • Als Antwort markiert BITsoft_mlutz Freitag, 14. Januar 2011 06:27
    Donnerstag, 13. Januar 2011 21:51

Alle Antworten

  • Mit "ds.Tables("power").Rows(myDataGrid.SelectedIndex" greifst Du auf die unsortierte Ausgangsfolge zu. Im Grid wird aber IMMER eine Sicht zur Anzeige genutzt. Entweder Du bindest selbst eine Sicht oder diese Sicht wird implizit zum Zeitpunkt der Bindung erzeugt. Nach dem ersten Sortiervorgang explizit durch Deine Zuweisung und Bindung des “DefaultView” oder auch implizit z.B. nach Klick auf Spaltenkopf klappt der Zugriff natürlich nicht mehr. SelectedIndex zeigt auf die Datenzeile der Sicht und stimmt im Normalfall nicht mehr mit der Datenzeile in der unsortierten Folge überein. Abhilfe schaft der Zugriff über die genutzte Sicht, z,B. so bei Nutzung von DefaultView:
     
    Dim dtRow As DataRow = CType(ds.Tables("power").DefaultView.Item(myDataGrid.SelectedIndex), DataRowView).Row
     
    --
    Viele Grüße
    Peter
    • Als Antwort markiert BITsoft_mlutz Freitag, 14. Januar 2011 06:27
    Donnerstag, 13. Januar 2011 21:51
  • Hallo Peter

    Vielen Dank. Es funktionierte auf Anhieb und ist für mich auch nachvollziehbar. Mein Problem liegt darin, dass ich seit Jahr und Tag mit VB6 und DAO unterwegs bin. Da ist ADO.NET erst mal ein völliges Umdenken.

    Ich wünsche dir eine schöne Restwoche!


    Michael Lutz, BITsoft
    Freitag, 14. Januar 2011 06:30