2016-05-31 10 views
0

Ich bin ein ListView von einer Linq to SQL-Abfrage-Liste mit diesem bevölkern:Beziehen eines Wertes aus einer Listview, die mit einer Linq to SQL-Abfrage bevölkert war

private void loademployeelist() 
    { 
     dbml.hrdbDataContext listpeople = new dbml.hrdbDataContext(); 
     var q = from p in listpeople.EmpIDs 
       join pi in listpeople.EmpBasicFiles on p.EmpID1 equals pi.EBF_EmpID 
       where pi.EBF_Active == activeornot 
       orderby p.LastName 
       select new classes.Employeeselected() { FirstName = p.FirstName, LastName = p.LastName, empid=p.EmpID1}; 

     foreach (var item in q) 
     { 
      lb_active_employee_names.Items.Add(new { LastName = item.LastName, FirstName = item.FirstName, empid = item.empid }); 
     } 
    } 

Das Problem ist, dass ich will nur den gewählten Wert der empid sein. Ich habe überall hingeschaut und finde keinen Weg, diesen Wert zu bekommen. Der Code, um den Wert zu erhalten, ist dies:

Ich bekomme immer einen Fehler beim Ausführen des Programms, nachdem ich es ausgewählt habe. Ich habe versucht, den Fehler nachzuschlagen, aber ich verirre mich in dieser riesigen Wildnis. Ich denke, ich verstehe begrifflich, was vor sich geht, aber ich weiß nicht, wie ich es beheben soll. Ich bin immer noch sehr neu in C#/Visual Studio. Hier

ist der Fehler:

An exception of type 'System.InvalidCastException' occurred in 6DegreesGateway.exe but was not handled in user code

Additional information: Unable to cast object of type '<>f__AnonymousType103[System.String,System.String,System.Decimal]' to type 'System.Windows.Controls.ListViewItem'.

Meine XAML sieht wie folgt aus:

 <ListView x:Name="lb_active_employee_names" HorizontalAlignment="Left" Height="135" Margin="10,148,0,0" VerticalAlignment="Top" Width="365" Grid.Column="1" Grid.Row="1" Loaded="listBox_Loaded" SelectionChanged="lb_active_employee_names_SelectionChanged" SelectedItem="{Binding Path=empid}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" /> 
       <GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" /> 
       <GridViewColumn Header="Employee ID" DisplayMemberBinding="{Binding empid}" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 

Ich habe versucht, Überprüfung, was andere getan haben, Binden oder Erstellen einer Klasse usw. Aber ich werde immer verwirrter.

+0

Was meinen Sie mit "Ich möchte nur den ausgewählten Wert der Empid sein?" Was versuchst du mit dem 'Empid' zu tun? –

+0

Werfen Sie einen Blick auf diese ähnliche Frage. Ich denke, die Antwort wird helfen. http://stackoverflow.com/questions/15091400/get-single-listview-selecteditem –

+0

@JasonBoyd Ich werde eine andere Abfrage von Empid auf einer anderen Tabelle ausführen. –

Antwort

0

Der Code, den ich beim Hinzufügen der Elemente zur Listbox verwendete, änderte den Typ in anonymous.

foreach (var item in q) 
    { 
     lb_active_employee_names.Items.Add(new { LastName = item.LastName,  FirstName = item.FirstName, empid = item.empid }); 
    } 

Statt dessen habe ich es so aus:

 foreach (var item in q) 
     { 
      lb_active_employee_names.Items.Add(item); 
     } 

Auf diese Weise alle Elemente in der Liste, einschließlich empid behielten ihre Art (zumindest das ist, was ich denke, passiert). Auf jedem Fall kann ich die Daten, die ich brauche (empid) aus, dass mit dieser Codezeile erhalten:

 var empsel = (classes.Employeeselected)lb_active_employee_names.SelectedItem; 
     empIdSelected = empsel.empid; 

Und dann kann ich weitere Fragen mit diesem Code auf anderen Tabellen ausgeführt werden.

Es ist nicht schön und ich bin sicher, es gibt einen besseren Weg, dies zu tun.