Show / Hide Table of Contents

MSDN.WhiteKnight - Stack Overflow answers

Ответ на "Вывод из базы данных в ListView WPF"

Answer 1260002

Link

Вот простой пример отображения таблицы из БД в 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>

listview

Здесь мы создаем две колонки с обычной привязкой к строковому свойству, и одну - с нестандартным шаблоном, который отображает 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.

Back to top Stack Overflow answers (published from sources in GitHub repository). Copyright (c) 2020, MSDN.WhiteKnight. Content licensed under BSD 3-Clause License.
Generated by DocFX