c# - Llenar un cuadro de lista WPF con elementos de una base de datos SQL(SDF)
listbox populate (4)
Intentaré algo como esto:
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();
Tenga en cuenta que necesitará configurar los enlaces correctos en su objeto CategoryList, probablemente a través de algún XAML como este:
<ListBox>
<ListBox.Resources>
<DataTemplate x:Key="DataTemplateItem">
<Grid Height="Auto" Width="Auto">
<TextBlock x:Name="Name" Text="{Binding Name}" />
</Grid>
</DataTemplate>
</ListBox.Resources>
</ListBox>
He estado buscando cómo hacer esto durante mucho tiempo, y no he logrado obtener una respuesta directa sobre el tema, así que espero que uno de ustedes usuarios de StackOverflow pueda ayudarme aquí. Tengo un ListBox de WPF llamado CategoryList y una base de datos SDF llamada ProgramsList.sdf (con dos tablas llamadas CategoryList y ProgramsList). Lo que deseo que haga mi programa es obtener los nombres de categoría de la tabla CategoryList y enumerarlos en el control ListBox llamado CategoryList.
Este es el código que probé, pero solo causó que mi programa fallara.
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();
¿Alguien puede ayudarme? ¡Gracias por adelantado!
Quizás te refieres a ...
CategoryList.Items.Add(dr.GetString(0));
....
Una forma mucho mejor es vincular su lista a un objeto que cree. De esta forma, puede especificar propiedades para DisplayMemberPath (lo que ve) y SelectedValuePath (el valor interno de su programa).
Aquí está tu código principal de XAML. Tenga en cuenta que el método de clic del botón mostrará el valor actualmente seleccionado de ComboBox. Eso va a facilitar las cosas más adelante. Esperemos que esto no sea exagerado, pero muestra algunos principios que hacen que WPF sea más fácil.
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");
}
}
}
El 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>
Su propio objeto para representar una Categoría
namespace WPFListBoxSample
{
public class Category
{
public int Id { get; set; }
public string CategoryName { get; set; }
}
}
Tenga en cuenta el {get; establecer;} ''s
Finalmente, un poco de pegamento que facilita muchas cosas es poner todos sus datos en un modelo y vinculantes para el modelo. Esta es la forma de trabajar 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; }
}
}
}
En general, la mejor manera de conectarse a la base de datos, al usar WPF, es el enlace a sql