2009-04-07 13 views
0

aktualisieren

ich durch die Data.DataTable iterieren entschieden und getrimmt dort die Werte.ComboBox Databinding Display und LINQ-Abfragen


Verwendung SirDemon's Post, habe ich den Code ein wenig aktualisiert:

Sub test(ByVal path As String) 
    Dim oData As GSDataObject = GetDataObj(path) 
    EmptyComboBoxes() 
    Dim oDT As New Data.DataTable 
    Try 
     Dim t = From r In oData.GetTable(String.Format("SELECT * FROM {0}gsobj\paths ORDER BY keyid", AddBS(path))) Select r 

     If t.Count > 0 Then 
      oDT = t.CopyToDataTable 
      For Each dr As Data.DataRow In oDT.Rows 
       dr.Item("key_code") = dr.Item("key_code").ToString.Trim 
       dr.Item("descript") = dr.Item("descript").ToString.Trim 
      Next 
      dataPathComboBox.DataSource = oDT 
      dataPathComboBox.DisplayMember = "descript" 
      dataPathComboBox.ValueMember = "key_code" 
      dataPathComboBox.SelectedIndex = 0 
      dataPathComboBox.Enabled = True 
     End If 
    Catch ex As Exception 

    End Try 
End Sub 

Das funktioniert fast wie ich es brauche die Daten, die ursprünglich aus einem foxpro Tisch ist, so dass die Saiten kehrt sind <value> plus (<Field>.maxlength-<value>.length) von nachfolgenden Leerzeichen Zeichen. Zum Beispiel hat ein Feld mit einer Länge von 12 Zeichen einen Wert von bob. Wenn ich die Datenbank abfrage, bekomme ich "bob_________", wobei _ ein Leerzeichen ist.

Ich habe ein paar verschiedene Dinge ausprobiert, die Leerzeichen, um loszuwerden, wie zum Beispiel:

dataPathComboBox.DisplayMember.Trim()
dataPathComboBox.DisplayMember = "descript".Trim.

Aber nichts hat noch funktioniert. Anders als Iterieren durch Data.DataTable oder Erstellen einer benutzerdefinierten CopyToDataTable Methode, gibt es eine Möglichkeit, die Werte zu trimmen? Vielleicht kann es inline mit der LINQ-Abfrage durchgeführt werden?


Hier ist der Code, den ich bisher habe, habe ich kein Problem, das Abfragen der Datenbank und die Informationen bekommen, aber ich kann nicht herausfinden, wie in der ComboBox-Liste den richtigen Text anzuzeigen. Ich bekomme immer System.Data.DataRow:

Try 
    Dim t = From r In oData.GetTable("SELECT * FROM ../gsobj/paths ORDER BY keyid") _ 
      Select r 

    dataPathComboBox.DataSource = t.ToList 
    dataPathComboBox.SelectedIndex = 0 
    'dataPathComboBox.DisplayMember = t.ToList.First.Item("descript") 
    dataPathComboBox.Enabled = True 
Catch ex As Exception 
    Stop 
End Try 

Ich weiß, dass auf der Display Linie des .First.Item() Teil falsch ist, ich wollte nur zeigen, welche Zeile ich als Display zu bezeichnen versuchen.

Antwort

1

Ich bin mir ziemlich sicher, dass Ihr Code versucht, eine ganze DataRow auf eine Eigenschaft zu setzen, die einfach der Name des Feldes (in einer starken Typklasse) oder einer Spalte (in einer DataTable) ist.

dataPathComboBox.DisplayMember = "descript" 

Sollte funktionieren, wenn die DataTable eine abgerufene Spalte mit diesem Namen enthält.

Ich würde auch vorschlagen, dass Sie Ihren SelectedIndex nur einstellen, nachdem Sie die DataBinding getan haben und Sie wissen, dass Sie tatsächlich Elemente haben, sonst kann SelectedIndex = 0 eine Ausnahme auslösen.

BEARBEITEN: Trimmen der Name der gebundenen Spalte trimmt nur das, nicht die tatsächliche gebundene Wert Zeichenfolge. Sie müssen entweder durch all Elemente gehen, nachdem sie und wie etwas tun gebunden worden ist:

dataPathComboBox.Item[i].Text = dataPathComboBox.Item[i].Text.Trim() 

Für jedes der Elemente. Nicht sicher, welche ComboBox-Steuerung Sie verwenden, daher könnte der Name der Elementauflistung etwas anderes sein.

Eine andere Lösung macht das für jedes Element, wenn es gebunden ist, wenn das ComboBox-Steuerelement ein onItemDataBound-Ereignis irgendeiner Art verfügbar macht.

Es gibt viele andere Möglichkeiten, dies zu tun, je nachdem, was die Steuerung selbst bietet und was Sie tun möchten.

+0

Beachten Sie, dass meine Antworten zur C# -Syntax tendieren, ich habe VB seit langer Zeit nicht mehr verwendet. – SirDemon

+0

Ja, ich kann C# -> VB.NET in meinem Kopf ziemlich gut konvertieren. Keine Sorge ^^. – Anders

0

DisplayMember soll den Namen der Eigenschaft angeben, die den anzuzeigenden Wert enthält.

In Ihrem Fall, ich bin nicht sicher, was die Syntax wird, da Sie scheinen ein DataSet zu verwenden, aber die

... DisplayMember="Item['descript']" ... 

in XAML sein sollte, es sei denn, Sie, dass zur Laufzeit wechseln müssen in In diesem Fall können Sie es in Code mit

dataPathComboBox.DisplayMember = "Item['descript']" 

wieder tun, nicht 100% sicher auf die Syntax. Wenn Sie ein stark typisiertes DataSet verwenden, ist es noch einfacher, da Sie eine "descript" -Eigenschaft in Ihrer Zeile haben sollten, aber da Ihr Fehler "System.DataRow" angibt und kein benutzerdefinierter Typ, sind Sie es nicht.

0

Weil ich nicht den zugrunde liegenden Typ der Datenquelle herauszufinden, können Sie ich verwenden schlage vor, Sie zu

dataPathComboBox.DisplayMember = t.ElementType.GetProperties.GetValue(0).Name 

und versuchen kommentiert Zeichenfolge zu ändern richtigen Index zu bestimmen (es anfänglich Null) in der Praxis.