Grid.SelectedItem zwraca null // Czym mogę zastąpić lub czy coś mogę zmienić?

0

Witam,
w przyszłym semestrze na studiach czeka mnie pisanie aplikacji WPF więc zacząłem sobie dłubać szybciej. Piszę prostą aplikację do której będzie wprowadzona baza produktów spożywczych oraz ich wartości odżywcze. Następnie będzie możliwość wprowadzania co, ile się jadło i kiedy. Aplikacja będzie podliczać to wszystko.

Wykorzystałem do tego lokalną bazę danych SQLite. W panelu zarządzania bazą produktów spożywczych wszystko działa mam problem jedynie z przyciskami które celowo miałyby przenosić wartości rekordu do textboxów aby móc je później edytować. Wyczytałem że do takiego pobrania danych można wykorzystać SelectedItem jednak funkcja ciągle zwraca Nulla.
Gdyby ktoś byłby w stanie mi podpowiedzieć byłbym bardzo wdzięczny :D

Link do repo na githubie:
https://github.com/SkowronskiMarcin/DIET_APP_2.0.git

Plik xaml

<Page x:Class="DIET_APP_2._0.ProductsScreen"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:DIET_APP_2._0"
      mc:Ignorable="d" 
      d:DesignHeight="600" d:DesignWidth="500"
      Title="ProductsScreen">

    <Grid Background="Azure">
        
        <Grid.RowDefinitions>
            <RowDefinition Height="60"/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Label Grid.Row="0" FontWeight="Bold" FontSize="20" HorizontalAlignment="Center" 
               VerticalAlignment="Center" Content="Panel z produktami">
        </Label>
        <DataGrid Grid.Row="1" Name="ProduktView" AutoGenerateColumns="False" IsReadOnly="true" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Nazwa" Binding="{Binding Nazwa}"></DataGridTextColumn>
                <DataGridTextColumn Header="Bialko" Binding="{Binding Bialko}"></DataGridTextColumn>
                <DataGridTextColumn Header="Weglowodany" Binding="{Binding Weglowodany}"></DataGridTextColumn>
                <DataGridTextColumn Header="Tluszcz" Binding="{Binding Tluszcz}"></DataGridTextColumn>
                <DataGridTextColumn Header="Kalorie" Binding="{Binding Kalorie}"></DataGridTextColumn>
                <DataGridTextColumn Header="Kategoria" Binding="{Binding Kategoria}"></DataGridTextColumn>
                
                <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Content="Edytuj" Click="TOEDIT_PRODUKT"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                
            </DataGrid.Columns>
        </DataGrid>
        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Border Grid.Column="0" BorderBrush="Black" BorderThickness="1" Margin="5">
                <StackPanel Margin="5" x:Name="TextBoxGrid">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        
                        <Label Grid.Row="0" Grid.Column="0" Content="Nazwa"/>
                        <TextBox Name="Nazwa" Grid.Row="0" Grid.Column="1" Text="{Binding Nazwa}"/>

                        <Label Grid.Row="1" Grid.Column="0" Content="Bialko"/>
                        <TextBox Name="Bialko" Grid.Row="1" Grid.Column="1" Text="{Binding Bialko}"/>

                        <Label Grid.Row="2" Grid.Column="0" Content="Weglowodany"/>
                        <TextBox Name="Weglowodany" Grid.Row="2" Grid.Column="1" Text="{Binding Weglowodany}"/>

                        <Label Grid.Row="3" Grid.Column="0" Content="Tluszcz"/>
                        <TextBox Name="Tluszcz" Grid.Row="3" Grid.Column="1" Text="{Binding Tluszcz}"/>

                        <Label Grid.Row="4" Grid.Column="0" Content="Kalorie"/>
                        <TextBox Name="Kalorie" Grid.Row="4" Grid.Column="1" Text="{Binding Kalorie}"/>

                        <Label Grid.Row="5" Grid.Column="0" Content="Kategoria"/>
                        <TextBox Name="Kategoria"  Grid.Row="5" Grid.Column="1" Text="{Binding Kategoria}"/>

                        <Button Grid.Row="6" Grid.Column="0" Content="Wykonaj" Margin="5" Click="FINALBUTTON"/>
                        
                    </Grid>

                </StackPanel>

            </Border>            
        </Grid>
    </Grid>
</Page>

Plik xaml.cs


using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;



namespace DIET_APP_2._0
{
    public partial class ProductsScreen : Page
    {
        
        public ProductsScreen()
        {          
            InitializeComponent();
            LOAD_PRODUKT();                    
        }

        readonly string connection = "Data Source=DIET_APP_DB.db;Version=3;New=false;Compress=True;"; //ZMIENNE WYKORZYSTYWANE W OPERACJACH NA BAZIE DANYCH
        private SQLiteConnection sql_con;
        private SQLiteCommand sql_cmd;
              
        private void ClearTextBoxs()  //WYCZYSZCZENIE TEXTBOXOW 
        {
            Nazwa.Text = String.Empty;
            Bialko.Text = String.Empty;
            Weglowodany.Text = String.Empty;
            Tluszcz.Text = String.Empty;
            Kalorie.Text = String.Empty;
            Kategoria.Text = String.Empty;
        }

        private void SetConnection() //OTWARCIE POLACZENIA Z BAZA DANYCH
        {
            sql_con = new SQLiteConnection(connection);
            sql_con.Open();
        }
        private void CloseConnection() //ZAMKNIECIE POLACZENIA Z BAZA DANYCH
        {
            sql_con.Close();
        }
        private void ExecuteQuery(string txtQuery) //WYKONANIE ZAPYTANIA
        {
            SetConnection();
            sql_cmd = sql_con.CreateCommand();
            sql_cmd.CommandText = txtQuery;
            sql_cmd.ExecuteNonQuery();
            CloseConnection();
        }

        private void ADD_PRODUKT()  //DODANIE PRODUKTU DO BAZY
        {
            if (Nazwa.Text != String.Empty && Bialko.Text != String.Empty && Weglowodany.Text != String.Empty && Tluszcz.Text != String.Empty && Kalorie.Text != String.Empty && Kategoria.Text != String.Empty)
            {
                string txtQuery = "Insert into Produkty(Nazwa,Bialko,Weglowodany,Tluszcz,Kalorie,Kategoria) VALUES ('" + Nazwa.Text + "','" + Bialko.Text + "','" + Weglowodany.Text + "','" + Tluszcz.Text + "','" + Kalorie.Text + "','" + Kategoria.Text + "')";
                ExecuteQuery(txtQuery);
                ClearTextBoxs();
                LOAD_PRODUKT();
                MessageBox.Show("Produkt dodany pomyślnie do bazy");               
            }
            else
            {
                MessageBox.Show("Najpierw uzupełnij wszystkie pola");
            }            
        }

        private void EDIT_PRODUKT() //EDYTOWANIE PRODUKTU
        {
            if (Nazwa.Text != String.Empty && Bialko.Text != String.Empty && Weglowodany.Text != String.Empty && Tluszcz.Text != String.Empty && Kalorie.Text != String.Empty && Kategoria.Text != String.Empty)
            {
                string txtQuery = "UPDATE Produkty SET Bialko='" + Bialko.Text + "',Weglowodany='" + Weglowodany.Text + "',Tluszcz='" + Tluszcz.Text + "',Kalorie='" + Kalorie.Text + "',Kategoria='" + Kategoria.Text + "' WHERE Nazwa='" + Nazwa.Text + "' ";
                ExecuteQuery(txtQuery);
                LOAD_PRODUKT();
                ClearTextBoxs();
                MessageBox.Show("Dane o produkcie zostały zaaktualizowane");
            }
            else
            {
                MessageBox.Show("Nie można ustawić parametrów na puste");
            }
        }

        private void LOAD_PRODUKT() //ZALADOWANIE PRODUKTÓW Z BAZY
        {
            try
            {
                string txtQuery = "Select Nazwa, Bialko, Weglowodany, Tluszcz, Kalorie, Kategoria from Produkty";
                SetConnection();
                sql_cmd = sql_con.CreateCommand();
                sql_cmd.CommandText = txtQuery;
                sql_cmd.ExecuteNonQuery();              
                SQLiteDataAdapter dataAdp = new SQLiteDataAdapter(sql_cmd);                
                DataTable dt = new DataTable("Produkty");
                dataAdp.Fill(dt);
                ProduktView.ItemsSource = dt.DefaultView;                
                CloseConnection();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }           
        }

        public class Produkt
        {
            public int ID { get; set; }
            public string Nazwa { get; set; }
            public double Bialko { get; set; }
            public double Weglowodany { get; set; }
            public double Tluszcz { get; set; }
            public double Kalorie { get; set; }
            public string Kategoria { get; set; }
        }


        Produkt selected = new Produkt();
        private void TOEDIT_PRODUKT(object s, EventArgs e) //PRZEKAZANIE DANYCH PRODUKTU DO TEXTBOXÓW
        {
            
            Produkt selected = ProduktView.SelectedItem as Produkt;
            TextBoxGrid.DataContext = selected; //Grid w którym występują textboxy
            MessageBox.Show(selected.Nazwa);
        }

        private void FINALBUTTON(object s,EventArgs e)//FUNKCJA FINALNEGO PRZYCISKU KTÓRY DODAJE NOWY PRODUKT JEŚLI NIE ZNAJDZIE TAKIEJ SAMEJ NAZWY A JEŚLI ZNAJDZIE EDYTUJE
        {
            string txtQuery = "Select Nazwa from Produkty Where Nazwa ='" + Nazwa.Text + "'";
            SetConnection();
            sql_cmd = sql_con.CreateCommand();
            sql_cmd.CommandText = txtQuery;
            sql_cmd.ExecuteNonQuery();
            SQLiteDataAdapter dataAdp = new SQLiteDataAdapter(sql_cmd);
            DataTable dt = new DataTable("Produkty");
            dataAdp.Fill(dt);
            if((dt == null)||(dt.Rows.Count==0))
            {
                ADD_PRODUKT();
            }
            else
            {
                EDIT_PRODUKT();              
            }
        }
    }
}
1

W twojej bazie nie ma tabeli produkty.
Chciałem pomóc, straciłem 10 minut.

ustaw się debugerem na selectedItem i zobacz co się pod nim kryje (może rzutowanie jest nieprawidłowe?)

screenshot-20220114111944.png

no i pomijam jakość kodu, bo jest tragiczna, ale rozumiem, że chcesz tylko zaliczyć i zapomnieć :D

0

Rozwiązałem to taką funkcją, temat do zamknięcia
screenshot-20220117205819.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1