MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Вывод из базы данных в ListView WPF"
Answer 1260002
Вот простой пример отображения таблицы из БД в ListView, без разделения на слои и использования EF.
Пусть у нас есть база данных
base
в SQL Server, и в ней таблица Users:CREATE TABLE [dbo].[Users]( [Name] [nvarchar](200) NULL, [Surname] [nvarchar](200) NULL, [Image] [nvarchar](max) NULL )
Тогда мы можем написать такой код для загрузки данных:
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; using System.Windows; using System.Windows.Controls; namespace WpfTest { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } static DataTable ExecuteSql(string sql) { DataTable dt=new DataTable(); SqlConnection conn = new SqlConnection( "Data Source=.\\SQLEXPRESS;Integrated Security=True;Initial Catalog=base" ); using (conn) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader read = cmd.ExecuteReader(); using (read) { dt.Load(read); } } return dt; } private void Button_Click(object sender, RoutedEventArgs e) { DataTable dt = ExecuteSql("SELECT * FROM Users"); listviewUsers.ItemsSource = dt.DefaultView; } } }
XAML:
<Window x:Class="WpfTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="250" Width="400" > <Grid > <Button Content="Load" HorizontalAlignment="Left" Height="40" Margin="10,0,0,0" VerticalAlignment="Top" Width="100" Click="Button_Click" /> <ListView x:Name="listviewUsers" HorizontalAlignment="Stretch" Margin="10,60,10,10" VerticalAlignment="Stretch"> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding Path=Name}" Header="Name" Width="100"/> <GridViewColumn DisplayMemberBinding="{Binding Path=Surname}" Header="Surname" Width="100"/> <GridViewColumn Header="Image" Width="100"> <GridViewColumn.CellTemplate> <DataTemplate> <Image Source="{Binding Path=Image}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView> </Grid> </Window>
Здесь мы создаем две колонки с обычной привязкой к строковому свойству, и одну - с нестандартным шаблоном, который отображает Image. При использовании EF все будет аналогично, только привязывать ItemsSource вы будете к коллекции конкретных сущностей вместо DataTable.
Документация: Binding Data to a ListView
Если в базе хранится не полный путь, а имя файла относительно общего каталога, нужно ввести дополнительный класс и преобразовывать путь при чтении из базы:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using System.Windows; using System.Windows.Controls; namespace WpfTest { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } static IEnumerable<User> ExecuteSql(string sql) { const string dir = "C:\\Test\\Images\\"; SqlConnection conn = new SqlConnection( "Data Source=.\\SQLEXPRESS;Integrated Security=True;Initial Catalog=base" ); using (conn) { conn.Open(); SqlCommand cmd = new SqlCommand(sql, conn); SqlDataReader read = cmd.ExecuteReader(); using (read) { while (true) { if (read.Read() == false) break; User user = new User() { Name = (string)read["Name"], Surname = (string)read["Surname"], Image = Path.Combine( dir , (string)read["Image"]) }; yield return user; } } } } private void Button_Click(object sender, RoutedEventArgs e) { User[] users = ExecuteSql("SELECT * FROM Users").ToArray(); listviewUsers.ItemsSource = users; } } public class User { public string Name { get; set; } public string Surname { get; set; } public string Image { get; set; } } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.