2016-05-31 1 views
0

Я заселять ListView из Linq в список запросов SQL с этим:Получение значения из ListView, который был населен с Linq для SQL запроса

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 }); 
     } 
    } 

Проблема заключается в том, что я просто хочу, выбранное значение чтобы быть empid. Я везде искал и не могу найти способ получить эту ценность. Код для получения значения:

private void lb_active_employee_names_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     ListViewItem empsel = (ListViewItem)lb_active_employee_names.SelectedItem; 
     string test = empsel.GetType().ToString(); 
     MessageBox.Show(test); 
     } 

Я продолжаю получать сообщение об ошибке при запуске программы после ее выбора. Я попытался найти ошибку, но я теряюсь в этой огромной пустыне. Я думаю, что я концептуально понимаю, что происходит, но я не знаю, как это исправить. Я все еще очень новичок в C#/Visual Studio.

Здесь ошибка:

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'.

Моя XAML выглядит следующим образом:

 <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> 

Я попытался обзор того, что сделали другие, или Переплет создания класса и т.д. Но я все больше запутался.

+0

Что вы подразумеваете под «Я просто хочу, чтобы выбранное значение было эмпирическим»? Что вы пытаетесь сделать с «empid»? –

+0

Взгляните на этот похожий вопрос. Я думаю, что ответ поможет. http://stackoverflow.com/questions/15091400/get-single-listview-selecteditem –

+0

@JasonBoyd Я буду запускать другой запрос от empid на другой таблице. –

ответ

0

Код, который я использовал при добавлении элементов в список, изменил тип на анонимный.

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

Вместо того, что я изменил его к этому:

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

Таким образом, все элементы в списке, в том числе EmpId сохранил свой тип (по крайней мере, это то, что я думаю, что произошло). В любом случае, я могу получить данные мне нужно (EmpId) от этого с этой строки кода:

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

И тогда я могу запустить дополнительные запросы с этим кодом на других таблицах.

Это некрасиво, и я уверен, что есть лучший способ сделать это.