2010-08-24 7 views
3

J'ai recherché comment faire cela pendant très longtemps, et je n'ai pas réussi à obtenir une réponse directe sur le sujet, donc j'espère que l'un d'entre vous Les utilisateurs de StackOverflow pourront m'aider ici. J'ai un ListBox WPF nommé CategoryList et une base de données SDF appelée ProgramsList.sdf (avec deux tables appelées CategoryList et ProgramsList). Ce que je souhaite que mon programme fasse est obtenir les noms de catégorie de la table CategoryList et les liste dans le contrôle ListBox appelé CategoryList.Remplir une zone de liste WPF avec des éléments d'une base de données SQL (SDF)

Voici le code que j'ai essayé, mais cela a seulement fait planter mon programme.

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

Quelqu'un peut-il m'aider? Merci d'avance!

+0

j'ai enfin trouvé la réponse, et le garçon, était-je bête! J'utilisais SQL Server dans mon code backend, qui est un framework pour les applications client-serveur en réseau, alors que j'aurais dû utiliser SQL Compact Edition pour les programmes de bureau locaux! Ce que je n'ai pas réalisé, c'est que MDF est pour SQL Server et SDF pour MDF. Peu importe, j'ai combiné le code de Nate et de stratton et les ai modifiés pour travailler avec SQL CE. Merci à tous pour votre aide! –

+0

Ici, si vous devez charger une valeur de chaîne, vous devez mettre 'dr.GetString (1)'.Soit si vous avez besoin de charger une valeur int, vous devez mettre 'dr.GetInt32 (0)'. Cela a fonctionné pour moi. [Cochez ici !!] (https://stackoverflow.com/questions/38032750/error-unable-to-cast-object-of-type-system-int32-to-type-system-string/44644672#44644672) – User6667769

Répondre

1

Je vais essayer quelque chose comme ceci:

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

Notez que vous aurez besoin de configurer les liaisons correctes dans votre objet CatégorieListe, probablement par une XAML comme ceci:

<ListBox> 
    <ListBox.Resources> 
     <DataTemplate x:Key="DataTemplateItem"> 
      <Grid Height="Auto" Width="Auto"> 
       <TextBlock x:Name="Name" Text="{Binding Name}" /> 
      </Grid> 
     </DataTemplate> 
    </ListBox.Resources> 
</ListBox> 
+0

Je l'ai essayé et il m'a donné une erreur sous ds.Tables ["CategoryList"]. Je crois que vous avez peut-être été mélangé entre les données et les collections. EDIT: Il aurait dû être ds.Table ["CategoryList"]. AsEnumerable(). Je vais répondre pour voir si cela fonctionne. –

+0

Essayez 'ds.Tables [0];' – Nate

+0

Désolé. Peu importe ce que je fais, il se bloque toujours et me donne une erreur 26, qui est: Erreur de localisation serveur/instance spécifiée. De l'aide? PS: Encore une fois, cela devrait être "ds.Tables [0]. AsEnumerable();" :) –

1

Peut-être vous dire: ....

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

....

2

Un bien meilleur moyen consiste à lier votre liste à un objet que vous créez. De cette façon, vous pouvez spécifier des propriétés pour DisplayMemberPath (ce que vous voyez) et SelectedValuePath (valeur interne de votre programme).

Voici votre code XAML principal. Notez que la méthode de clic du bouton affichera la valeur actuellement sélectionnée de la ComboBox. Cela va faciliter les choses plus tard. J'espère que ce n'est pas exagéré mais cela montre quelques principes qui rendent WPF facile.

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

}

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

Votre propre objet pour représenter une catégorie

namespace WPFListBoxSample 
{ 
    public class Category 
    { 
     public int Id { get; set; } 
     public string CategoryName { get; set; } 
    } 
} 

Notez le {get; set;}

Enfin un peu de colle qui rend beaucoup de choses faciles est de mettre toutes vos données dans un modèle et de lier le modèle. C'est la façon de travailler 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; } 
     } 
    } 
} 
0

généralement la meilleure façon de se connecter à la base de données, lors de l'utilisation WPF, est lien vers sql

Questions connexes