[英]Populating a WPF listbox with items from an SQL (SDF) database
我一直在尋找如何做這個很長一段時間,我還沒有設法得到關於這個主題的直接答案,所以希望你們中的一個StackOverflow用戶能夠在這里幫助我。 我有一個名為CategoryList的WPF ListBox和一個名為ProgramsList.sdf的SDF數據庫(有兩個名為CategoryList和ProgramsList的表)。 我希望我的程序要做的是從CategoryList表中獲取類別名稱,並將它們列在名為CategoryList的ListBox控件中。
這是我嘗試過的代碼,但它只會導致我的程序崩潰。
SqlConnection myConnection = new SqlConnection("Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "ProgramsList.sdf");
SqlDataReader myReader = null;
myConnection.Open();
CategoryList.Items.Clear();
SqlDataReader dr = new SqlCommand("SELECT Name FROM CategoryList ORDER BY Name DESC", myConnection).ExecuteReader();
while (myReader.Read())
{
CategoryList.Items.Add(dr.GetInt32(0));
}
myConnection.Close();
誰能幫我? 提前致謝!
我會嘗試這樣的事情:
var myConnection = new SqlConnection("Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "ProgramsList.sdf");
var cmd = new SqlCommand("SELECT Name FROM CategoryList ORDER BY Name DESC", myConnection);
myConnection.Open();
CategoryList.Items.Clear();
var sda = new SqlDataAdapter(cmd);
var ds = new DataSet();
sda.Fill(ds);
CategoryList.ItemsSource = ds.Tables["CategoryList"];
myConnection.Close();
請注意,您需要在CategoryList對象中設置正確的綁定,可能通過某些XAML,如下所示:
<ListBox>
<ListBox.Resources>
<DataTemplate x:Key="DataTemplateItem">
<Grid Height="Auto" Width="Auto">
<TextBlock x:Name="Name" Text="{Binding Name}" />
</Grid>
</DataTemplate>
</ListBox.Resources>
</ListBox>
更好的方法是將列表綁定到您創建的對象。 這樣,您可以為DisplayMemberPath(所見)和SelectedValuePath(您的程序內部值)指定屬性。
這是您的主要XAML代碼。 注意,按鈕的click方法將顯示當前所選的ComboBox值。 這將使以后的事情變得簡單。 希望這不是矯枉過正,但它顯示了一些使WPF變得容易的原則。
namespace WPFListBoxSample {
public partial class Window1 : Window
{
WPFListBoxModel model = new WPFListBoxModel();
public Window1()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Window1_Loaded);
}
void Window1_Loaded(object sender, RoutedEventArgs e)
{
GetData();
this.DataContext = model;
}
public void GetData()
{
//SqlConnection myConnection = new SqlConnection("Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "ProgramsList.sdf");
SqlConnectionStringBuilder str = new SqlConnectionStringBuilder();
str.DataSource="192.168.1.27";
str.InitialCatalog="NorthWnd";
str.UserID="sa";
str.Password="xyz";
SqlConnection myConnection = new SqlConnection(str.ConnectionString);
SqlDataReader myReader = null;
myConnection.Open();
SqlDataReader dr = new SqlCommand("SELECT CategoryId, CategoryName FROM Categories ORDER BY CategoryName DESC", myConnection).ExecuteReader();
while (dr.Read())
{
model.Categories.Add(new Category { Id = dr.GetInt32(0), CategoryName = dr.GetString(1) });
}
myConnection.Close();
}
private void myButton_Click(object sender, RoutedEventArgs e)
{
if (this.myCombo.SelectedValue != null)
MessageBox.Show("You selected product: " + this.myCombo.SelectedValue);
else
MessageBox.Show("No product selected");
}
}
}
XAML
<Grid>
<StackPanel>
<ComboBox x:Name="myCombo" ItemsSource="{Binding Categories}" DisplayMemberPath="CategoryName" SelectedValuePath="Id" />
<Button x:Name="myButton" Content="Show Product" Click="myButton_Click"/>
</StackPanel>
</Grid>
您自己的用於表示類別的對象
namespace WPFListBoxSample
{
public class Category
{
public int Id { get; set; }
public string CategoryName { get; set; }
}
}
注意{get; 集;}的
最后,使用一些簡單的粘合劑可以將所有數據放入模型中並綁定到模型中。 這是WPF的工作方式。
using System.Collections.Generic;
namespace WPFListBoxSample
{
public class WPFListBoxModel
{
private IList<Category> _categories;
public IList<Category> Categories
{
get
{
if (_categories == null)
_categories = new List<Category>();
return _categories; }
set { _categories = value; }
}
}
}
也許你的意思是:....
CategoryList.Items.Add(dr.GetString(0));
....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.