Заполнение списка WPF элементами из базы данных SQL (SDF) - PullRequest
4 голосов
/ 24 августа 2010

Я очень долго искал, как это сделать, и мне не удалось получить прямой ответ по этому вопросу, поэтому, надеюсь, один из вас, пользователей StackOverflow, сможет помочь мне здесь.У меня есть WPF ListBox с именем CategoryList и база данных SDF ProgramsList.sdf (с двумя таблицами под названием CategoryList и ProgramsList).Я хочу, чтобы моя программа получала имена категорий из таблицы CategoryList и перечисляла их в элементе управления ListBox с именем CategoryList.

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

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

Кто-нибудь может мне помочь?Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 25 августа 2010

Гораздо лучший способ - привязать ваш список к объекту, который вы создаете.Таким образом, вы можете указать свойства для DisplayMemberPath (что вы видите) и SelectedValuePath (внутреннее значение ваших программ).

Вот ваш основной код XAML.Обратите внимание, что метод щелчка кнопки будет отображать текущее выбранное значение 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;set;} s

Наконец, немного клея, облегчающего многие вещи, - это помещение всех ваших данных в модель и привязка к модели.Это способ работы 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; }
        }
    }
}
2 голосов
/ 24 августа 2010

Я бы попробовал что-то вроде этого:

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>
1 голос
/ 24 августа 2010

Возможно, вы имеете в виду: ....

CategoryList.Items.Add(dr.GetString(0));

....

...