Тема: listBox відкриття даних з БД

Маю listBox в який виводжу записи з БД. Маю проблему у реалізації відкриття даних з listBox, типу, коли натискаю на запис у мене повинно відкритися вікно в якому в певні поля повинні передатися дані з БД цього запису.
Ось такі напрацювання

Відкриття форми з передачею до неї записів

private void btnUpt_Click(object sender, RoutedEventArgs e)
{
    if (listBoxContacts.SelectedItem != null)
    {
        var bas = new WinRozpisNew { Owner = this };
        bas.ShowDialog();

        // як передати ID на перевірку обраного listBox?

        con = new SqlConnection(constr);
        con.Open();
        string SQL = "SELECT * FROM OKP WHERE ID = @ID";
        cmd.Parameters["@ID"].Value = Convert.ToString(id);
        cmd = new SqlCommand(SQL, con);
        // передача даних на іншу форму
    }
    else MessageBox.Show("Оберіть працівника!", "Повідомлення",
            MessageBoxButton.OK, MessageBoxImage.Information);
}

Передача елементів з БД до listBox

private void BindData()
{
    DataSet dtSet = new DataSet();
    using (con = new SqlConnection(constr))
    {
        cmd = new SqlCommand(sql, con);
        da = new SqlDataAdapter();
        con.Open();
        da.SelectCommand = cmd;
        da.Fill(dtSet, "Customers");
        listBoxContacts.DataContext = dtSet;
    }
}

Або є ідея у передачі цього обраного ID на інше вікно а там виконати перевірку та вивести елементи. Але знову ж таки, проблема у отриманні відповідного ID.

2

Re: listBox відкриття даних з БД

Ви з лістбокса ID не можете витягнути ?

Я так розумію що ListBox у вас для WPF, а DataSet це System.Data.DataSet ?
І які дані він у вас показує в ListBox після передачі елементів ч-з BindData() ?

3

Re: listBox відкриття даних з БД

Engineer написав:

Ви з лістбокса ID не можете витягнути ?
Я так розумію що ListBox у вас для WPF, а DataSet це System.Data.DataSet ?

Так, все правильно.

І які дані він у вас показує в ListBox після передачі елементів ч-з BindData() ?

Поки що такі:

 string sql = "SELECT Sname, Name, Image_Prac FROM OKP";

Але в подальшому додам ID. А от як зробити перевірку, що саме та комірка на яку я на жму буде мати відповідний ID?

4 Востаннє редагувалося Engineer (23.05.2016 19:16:30)

Re: listBox відкриття даних з БД

1) listBoxContacts.DataContext = dtSet; просто так ListBox не буде мати ніякого списку
2) навіть коли список обєктів буде доступним для ListBox, треба налаштувати шаблон відображення даних

дивіться приклад

public MainWindow()
{
    InitializeComponent();

    System.Data.DataSet dtSet = new System.Data.DataSet();
    using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(
        System.Configuration.ConfigurationManager.ConnectionStrings["LogisticSystemDbConnection"].ConnectionString))
    {
        System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM country", con);
        System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter();
        con.Open();
        da.SelectCommand = cmd;
        da.Fill(dtSet, "Country");  // моя таблиця називається Country

        listBox.DataContext = dtSet; //з  DataSet просто так ListBox нічого не витягне, йдемо іншим шляхом         

        // ListBox отримає масив типу DataRow. (тут це список країн)
        listBox.ItemsSource = dtSet.Tables["Country"].Select();

        // створимо візуальний шаблон для перегляду даних на основі TextBlock

        // System.Data.DataRow - тип даних для якого створюється візуальний шаблон
        DataTemplate dtt = new DataTemplate(typeof(System.Data.DataRow));
        FrameworkElementFactory _textBlock = new FrameworkElementFactory(typeof(TextBlock));

        // привяжемо поле для перегляду в ListBox. Мені треба назву країни
        _textBlock.SetBinding(TextBlock.TextProperty, new Binding("ItemArray[2]"));

        // DataRow має масив ItemArray в якому є значення усіх полів з запиту до БД, назва в мене 3-й стовпець
        dtt.VisualTree = _textBlock;
        listBox.ItemTemplate = dtt;
    }
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    if (listBox.SelectedItem != null)
    {
        // приведемо до того типу, масив якого передали в listBox.ItemsSource
        System.Data.DataRow row = (System.Data.DataRow)listBox.SelectedItem;
        MessageBox.Show("Вибрано " + row.ItemArray[2]); // знову ж таки беремо назву країни, 
        // якщо треба інше поле з БД, то треба знати його номер в результаті запиту
    }
}

а ось результат роботи
http://replace.org.ua/misc.php?action=pun_attachment&item=1290&download=0

Взагалі варто було би створити обєкт типу Contact з необхідними даними, після запиту до БД формувати список таких обєктів і вже дальше працювати з цим списком. Також все налаштування DataTemplate для ListBox краще робити в XAML.

Post's attachments

WPFlistBoxSample.PNG 7.98 kb, 242 downloads since 2016-05-23 

Подякували: lichmanmaksim1

5

Re: listBox відкриття даних з БД

Дуже дякую Вам, зараз почну розбиратися та може щось і виведу, якщо ні, то просто усе переведу до DataGrid і проблем, просто хочеться, щоб усе красиво було..

У мене усі налаштування якраз і на Wpf.

<Page.Resources>
    <Style TargetType="{x:Type ListBox}">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Border BorderBrush="#FF557B83" BorderThickness="1" Margin="10" Background="#FFE5EFC1">
                        <Border.BitmapEffect>
                            <DropShadowBitmapEffect Color="Black" Direction="315"
                                ShadowDepth="5" Softness="0.25" Opacity="0.5"/>
                        </Border.BitmapEffect>
                        <StackPanel Margin="5" >
                            <Image Source="{Binding Image_Prac}" Width="134" Height="153"/>

                            <TextBlock HorizontalAlignment="Center" Margin="2" Text="{Binding Path=Name}" />
                            <TextBlock HorizontalAlignment="Center" Margin="2" Text="{Binding Path=Sname}" />
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <WrapPanel />
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" />
    </Style>
</Page.Resources>

<Grid Background="#FFA2D5AB">
    <StackPanel Orientation="Horizontal" Background="#FF39AEA9" Height="80" VerticalAlignment="Top" Margin="0">
        <materialDesign:ColorZone Mode="Standard" Padding="8 4 8 4" CornerRadius="2" Panel.ZIndex="1"
            Margin="10,20,10,20" materialDesign:ShadowAssist.ShadowDepth="Depth1">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Button Style="{DynamicResource MaterialDesignToolButton}">
                <materialDesign:PackIcon Kind="Magnify" Opacity=".56" />
            </Button>
            <TextBox Grid.Column="1" Margin="8 0 0 0" materialDesign:HintAssist.Hint="Введіть прізвище працівника" 
                materialDesign:TextFieldAssist.DecorationVisibility="Hidden" BorderThickness="0"
                MinWidth="200" VerticalAlignment="Center" />
         </Grid>
        <ListBox Name="listBoxContacts" ItemsSource="{Binding Customers}"
            MouseDoubleClick="listBoxContacts_MouseDoubleClick" Margin="0,80,0,0"
            BorderBrush="{x:Null}" Background="#FFA2D5AB"/>
</Grid>
Post's attachments

Безымянный.png 159.79 kb, 311 downloads since 2016-05-23 

6

Re: listBox відкриття даних з БД

UI виглядає гарно