2015-12-07 81 views
2

正如標題所示,我試圖用db查詢的結果填充ListBox,但我不確定如何管理它。我已經設法從另一個查詢填充DataGrid,但我不確定如何對ListBox執行相同的操作。我相信這很簡單,但我錯過了一些東西!類似的溢出頁面/谷歌搜索尚未得出明確的答案。我在Visual Studio的WPF應用程序中使用c#。用db查詢結果填充ListBox

在一個單獨的類我有這樣的:

public DataTable FillAllMenuItems() 
{ 
    SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\DustCatcher\Documents\pizzeria.mdf;Integrated Security=True;Connect Timeout=30"); 
    SqlCommand cmd = new SqlCommand("SELECT name FROM MenuItems", con); 
    SqlDataAdapter sda = new SqlDataAdapter(cmd); 
    DataTable dt = new DataTable("Menu Items"); 
    sda.Fill(dt); 
    return dt; 
} 

順便說一句,我敢肯定,上面是凌亂的,所以任何指針會有很大的(我需要一個using任何地方嗎?)。在相關窗口CS文件我有:

User user = User.GetInstance(); 
lstbxAllItems.ItemsSource = user.FillAllMenuItems().DefaultView; 

運行的應用程序,該ListBoxSystem.Data.DataRowView多次有在數據庫中的項目。我哪裏錯了?

+0

設置'ValueMemberPath'和'DisplayMemberPath'你'ListBox'還我會建議使用'using'報表您'的SqlConnection,SqlCommand'等鏈接,' ItemSource' http://stackoverflow.com/questions/1790878/wpf-listbox-how-to-put-values-from-datatable – Sybren

+0

Displaymemberpath做到了 - 感謝您的評論! – Penta

+0

@ user2946329感謝您的簡短教訓。 – Penta

回答

2

您需要設置lstbxAllItems.DisplayMemberPathlstbxAllItems.ItemsSource

lstbxAllItems.DisplayMemberPath = "Name"; // Or any column you want to show in your ListBox 

但作爲一個更好的方法,你可以使用ListView.ItemTemplateBinding用於這一目的。事情是這樣的:

<ListBox Name="lstbxAllItems"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"></TextBlock> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

非常感謝,爲此添加了displaymemberpath功能!我會更多地瞭解你的建議替代方法,因爲我不太清楚如何正確實施它! – Penta

1
private void BindListbox() 
{ 
    myListBox.DataSource = dt; 
    myListBox.DisplayMemberPath = "Name"; 
} 
+0

謝謝你的回答,儘管我想在他們都陷入困境之前避免更多的方法! – Penta

+0

在WPF中'DisplayMember'應該是'DisplayMemberPath'。請編輯您的答案並將其更改爲「DisplayMemberPath」。 –