tablica z notatkami C# WPF

0

Witam mam pomysł zrobienia tablicy na której w losowym miejscu będą się układały notatki. Chodzi mi o coś tego typu

user image

Na kwadraciku ma być imię, nazwisko i data a po kliknięciu w kwadracik się powiększyć i pokazać notatka w nim zawarta? Jakieś podpowiedzi jak to zrobić? :P
Oczywiście graficznie to nie musi wyglądać tak dobrze jak na zdjęciu wystarczy zwykły kwadrat która jest funkcjonalny jak wyżej opisałem.

Wszytsko C#, WPF - mvvm nie ogarniam

0

A co tu za filozofia? Obiekty + losowanie pozycji danej kartki. Masz jakiś konkretny problem?

0

A wiec podczas tworzenia tego napotkałem 2 problemy.

  1. jak podzielić wyrazy oddzielone ',' z button.content?
  2. jak zrobić żeby nie wywalalo mi błędu

"An unhandled exception of type 'System.ArgumentException' occurred in PresentationCore.dll
Additional information: Określony obiekt Visual jest podrzędny w stosunku do innego obiektu Visual lub elementu głównego CompositionTarget."

gdy wrzucam MainGrid.Children.Add(button); do foreacha żeby dodwało mi kilka notatek a nie tylko 1.

mój kod c#

  public partial class WinNotes : Window
    {
        void btn_Click(object sender, RoutedEventArgs routedEventArgs)
        {
            OpenedNote.Visibility = Visibility.Visible;
            DataBase _dbNotes = new DataBase();
            DataTable _dtNotes = new DataTable();
            string[] splitnote = button.Content.ToString().Split(','); //nie dzieli łancuchu znaków
            _dtNotes = _dbNotes.GetDataTable($"select tresc_notatki,data,id_uzytkownika from notatki where id_notatki ={splitnote[0].ToString()}");
            foreach (DataRow _dwNotes in _dtNotes.Rows)
            {
                txtNoteCont.Text = _dwNotes[0].ToString();
                txtDateNote.Text = _dwNotes[1].ToString();

                DataTable _dtIdd = new DataTable();
                DataBase _dbIdd = new DataBase();
                _dtIdd = _dbIdd.GetDataTable($"select imie,nazwisko from uzytkownicy where id_uzytkownika={_dwNotes[2].ToString()}");
                foreach (DataRow _dwIdd in _dtIdd.Rows)
                {
                    txtNameLastName.Text = $"{_dwIdd[0].ToString()} {_dwIdd[1]}";
                }
            }
        }

        public Button button = new Button();
        public WinNotes(string userName)
        {
            InitializeComponent();

            Random rnd = new Random();
            int rnd1 = rnd.Next(1, 510);
            int rnd2 = rnd.Next(1, 270);

            button.Margin = new Thickness(rnd1, rnd2, 0, 0);
            button.Width = 120;
            button.Height = 120;
            button.Background = Brushes.Khaki;
            button.HorizontalAlignment = HorizontalAlignment.Left;
            button.VerticalAlignment = VerticalAlignment.Top;
            button.FontSize = 15;
            button.FontWeight = FontWeight.FromOpenTypeWeight(10);
            button.Name = "btn";
            button.Click += btn_Click;

            DataTable _dtNote = new DataTable();
            DataBase _dbNote = new DataBase();
            _dtNote =
                _dbNote.GetDataTable(
                    $"select * from notatki where id_raportu={MainWindow.idrap}");
            foreach (DataRow _dw in _dtNote.Rows)
            {
                DataTable _dtId = new DataTable();
                DataBase _dbId= new DataBase();
                _dtId = _dbId.GetDataTable($"select imie,nazwisko from uzytkownicy where id_uzytkownika={_dw[1].ToString()}");

                foreach (DataRow _dwId in _dtId.Rows)
                {
                    button.Content = new TextBlock
                    {
                       Inlines = { $"{_dw[4].ToString()}", ",", new LineBreak(), $"{_dwId[0].ToString()}",",",new LineBreak(), $"{_dwId[1].ToString()}",",",new LineBreak(), $"{_dw[3].ToString()}" }
                    };
                }
            }
            MainGrid.Children.Add(button); // gdy wrzucam do powyższego foreach wywala błąd opisany na początku postu
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            OpenedNote.Visibility = Visibility.Hidden;
            txtDateNote.Text = string.Empty;
            txtNameLastName.Text = string.Empty;
            txtNoteCont.Text = string.Empty;
        }
    } 

kod xaml:

    <Grid>
        <Grid.Background>
            <ImageBrush ImageSource="C:\Users\Szymon\Desktop\PRACA\PRACA RAPORT8D\tablica.jpg"/>
        </Grid.Background>
        <Grid Margin="20,20,20,20" x:Name="MainGrid">
        </Grid>
        <Grid x:Name="OpenedNote" Visibility="Hidden" >
            <Rectangle x:Name="rectangle" HorizontalAlignment="Left" Height="320" Stroke="Black" VerticalAlignment="Top" Width="455" Margin="115,80,0,0" RenderTransformOrigin="0.5,0.5" RadiusX="40" RadiusY="40" StrokeThickness="2" Opacity="0.8" Fill="Khaki"/>
            <Button Width="20" Margin="535,100,137,339" Background="{x:Null}" BorderBrush="{x:Null}" Click="Button_Click" FontWeight="Bold" FontFamily="Blackoak Std">X</Button>
            <TextBlock x:Name="txtNoteCont" HorizontalAlignment="Left" Margin="145,110,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Height="210" Width="390"/>
            <TextBlock x:Name="txtNameLastName" HorizontalAlignment="Left" Margin="365,325,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="170"/>
            <TextBlock x:Name="txtDateNote" HorizontalAlignment="Left" Margin="400,341,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="135"/>
        </Grid>
    </Grid>

zdjecie :

Nie ładuje się z powodu że nie może podzielić button.content i pobrać 1 wyrazu -id_notatki i na podstawie tego załadować dane. user image

0
    • może należałoby tworzyć nowy przycisk w każdej iteracji? Bo w obecnej sytuacji ciągle dodajesz do grida ten sam, tylko z różnym tekstem w środku.
0
Juhas napisał(a):

A co tu za filozofia? Obiekty + losowanie pozycji danej kartki. Masz jakiś konkretny problem?

Przydałoby się losowanie faworyzujące puste miejsca, albo nawet zakrywanie starych karteczek według jakichś priorytetów.

0
ness napisał(a):
    • może należałoby tworzyć nowy przycisk w każdej iteracji? Bo w obecnej sytuacji ciągle dodajesz do grida ten sam, tylko z różnym tekstem w środku.

Racja wrzuciłem wszytsko do pętli i zadziałało.

Azarien napisał(a):
Juhas napisał(a):

A co tu za filozofia? Obiekty + losowanie pozycji danej kartki. Masz jakiś konkretny problem?

Przydałoby się losowanie faworyzujące puste miejsca, albo nawet zakrywanie starych karteczek według jakichś priorytetów.

Jakieś podopowiedzi jak to zrobić?

Jeszcze jedno pytanie jak nadpisać metody ToString klasy Button?

tak wiem ale gdzie ją zapisać?
public override string ToString()
{
}

0

user image

split już działa wszystko już prawie pięknie tylko jeszcze ostatnia rzecz, click ładuje tylko zawartość ostatniej notatki, nie zależnie w która się kliknie ładuje się tylko tresc ostatniej jak z tymi sobie poradzić?

kod po zmianie wygląda tak:

        void btn_Click(object sender, RoutedEventArgs routedEventArgs)
        {
            OpenedNote.Visibility = Visibility.Visible;
            DataBase _dbNotes = new DataBase();
            DataTable _dtNotes = new DataTable();
            string[] splitnote = button.Content.ToString().Split(',');
            _dtNotes = _dbNotes.GetDataTable($"select tresc_notatki,data,id_uzytkownika from notatki where id_notatki ={splitnote[0].ToString()}");
            foreach (DataRow _dwNotes in _dtNotes.Rows)
            {
                txtNoteCont.Text = _dwNotes[0].ToString();
                txtDateNote.Text = _dwNotes[1].ToString();

                DataTable _dtIdd = new DataTable();
                DataBase _dbIdd = new DataBase();
                _dtIdd = _dbIdd.GetDataTable($"select imie,nazwisko from uzytkownicy where id_uzytkownika={_dwNotes[2].ToString()}");
                foreach (DataRow _dwIdd in _dtIdd.Rows)
                {
                    txtNameLastName.Text = $"{_dwIdd[0].ToString()} {_dwIdd[1]}";
                }
            }
        }

        public Button button = new Button();

        public WinNotes(string userName)
        {
            InitializeComponent();

            DataTable _dtNote = new DataTable();
            DataBase _dbNote = new DataBase();
            _dtNote =
                _dbNote.GetDataTable(
                    $"select * from notatki where id_raportu={MainWindow.idrap}");
            foreach (DataRow _dw in _dtNote.Rows)
            {
                Random rnd = new Random();
                int rnd1 = rnd.Next(1, 510);
                int rnd2 = rnd.Next(1, 270);


                button = new Button
                {
                    Margin = new Thickness(rnd1, rnd2, 0, 0),
                    Width = 120,
                    Height = 120,
                    Background = Brushes.Khaki,
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment = VerticalAlignment.Top,
                    FontSize = 15,
                    Name="btn"
                };
                button.Click += btn_Click;


                DataTable _dtId = new DataTable();
                DataBase _dbId = new DataBase();
                _dtId = _dbId.GetDataTable($"select imie,nazwisko from uzytkownicy where id_uzytkownika={_dw[1].ToString()}");
                foreach (DataRow _dwId in _dtId.Rows)
                {
                    button.Content = ($"{_dw[4].ToString()},"+$"{_dwId[0].ToString()},"+
                     $" {_dwId[1].ToString()},"+ $"{_dw[3].ToString()}");
                }
                MainGrid.Children.Add(button);
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            OpenedNote.Visibility = Visibility.Hidden;
            txtDateNote.Text = string.Empty;
            txtNameLastName.Text = string.Empty;
            txtNoteCont.Text = string.Empty;
        }
    }
0

A co to za niezamknięte połączenia z bazą danych?

0

up:P

1

Musisz to wszystko opisać w kodzie

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