Dodanie elementu do listy utworzonej w innym formularzu

0

Cześć.
Mam dwa formularze, główny na którym jest przycisk który otwiera nowy formularz w którym chcę dodawać nowe obiekty do utworzonej listy.
Lista ma być dostępna globalnie tak żebym ją mógł wyświetlać w głównym formularzu a dodawać elementy w innym. W którym miejscu powinienem utworzyć listę?
Form1, gdzie docelowo będę wyświetlać listę:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Rachunki
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void Form1_Load(object sender, EventArgs e)
        {

            List<Rachunek> rachunek = new Rachunek();//utworzenie listy rachunek.Gdzie to wpisać aby lista rachunek była widoczna w form2?
        }

        private void bDodaj_Click(object sender, EventArgs e)
        {
            FDodaj fDodaj = new FDodaj();//pokazanie nowego okna
            fDodaj.Show();
        }
    }
}

Form2 gdzie chcę dodawać elementy do listy.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Rachunki
{
    public partial class FDodaj : Form
    {
        public FDodaj()
        {
            InitializeComponent();
        }

        private void bAnuluj_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void bZatwierdz_Click(object sender, EventArgs e)
        {
            rachunek.Add(jakis obiekt)//tutaj chcę dodać rachunek do listy rachunek
        }
    }
}

Przy tym kodzie Form 2 nie widzi nazwy rachunek.

2
specjal1990 napisał(a):

Cześć.

Cześć

Przy tym kodzie Form 2 nie widzi nazwy rachunek.

Wprowadzasz nas w błąd. Kod w wielu miejscach musi rzucać komunikatami o błędach kompilacji. Np podstawienie new Rachunek() pod Listę musi zgłaszać błąd.

Mam dwa formularze, główny na którym jest przycisk który otwiera nowy formularz w którym chcę dodawać nowe obiekty do utworzonej listy.
Lista ma być dostępna globalnie tak żebym ją mógł wyświetlać w głównym formularzu a dodawać elementy w innym.

W którym miejscu powinienem utworzyć listę?

Prawie zawsze grzebanie w bebechach innej klasy (formy) jest złe

I prawie zawsze jak dwie Formy muszą / wydaje się ze muszą pracować na wspólnych danych, lekarstwem jest wyrzucenie danych poza obie, do nowej klasy ktora nie jest GUI, ale jest pojemnikiem na dane. Takie coś najczęściej nosi nazwę Model

Kodu nie dam, m.in. ponieważ ty nie przestawiasz kompletu informacji, na czym by go zbudować.
Aby zaprojektować klase modelu, tzreba by omówić pełny projekt danych, jaki ma przechowywać.

2

http://forum.4programmers.net/1208091

    public class BillItem
    {
        public String Title { get; set; }
        public decimal Count { get; set; }
        public decimal Price { get; set; }
    }
    public class Bill
    {
        private List<BillItem> list = new List<BillItem>();
        public void Add(BillItem item) list.Add(item);
        public List<BillItem> data { get { return list; } }
    }
    public partial class Form1 : Form
    {
        private Bill list=new Bill();
        public Form1()
        {
            InitializeComponent();
        }

        private void bDodaj_Click(object sender, EventArgs e)
        {
            new FDodaj(list).Show();
        }
    }
    public partial class FDodaj : Form
    {
        private Bill list;
        public FDodaj(Bill list)
        {
            InitializeComponent();
            this.list=list;
        }

        private void bZatwierdz_Click(object sender, EventArgs e)
        {
            list.Add(new BillItem());
        }
    }
0

Próbowałem to zastosować w moim programie i coś mi nie wychodzi.
Postanowiłem wpisać powyższy kod żeby przeanalizować to u mnie.
Nazwałem formularze i przyciski tak jak wyżej i Visual Studio ciągle zgłasza mi błąd w klasie Bill.Nie można niejawnie przekonwertować typu BillItem na System.Colection.Generic.List<bill.BillItem>
![xxx.jpg]xxx.jpg

0
specjal1990 napisał(a):

i Visual Studio ciągle zgłasza mi błąd w klasie Bill.Nie można niejawnie przekonwertować typu BillItem na System.Colection.Generic.List<bill.BillItem>

A podobno w twojej pierwotnej wersji nie było identycznego komunikatu?
Jaka jest prawda?

0

W mojej wersji błędy były zgłaszane przy próbie odwołania się do listy w drugim formularzu. A tutaj są zgłaszane tylko w tym miejscu co zaznaczyłem. Czyli jest już lepiej. W formularzach są ok. Nie potrafię tego problemu przeskoczyć...aby lista była widoczna w wielu formularzach to musi być zadeklarowana w klasie tak?

0

Chyba czegoś tutaj nie potrafie zrozumieć i jestem w martwym punkcie.
Może dla ułatwienia zrozumienia tego uprośćmy sobie problem.
Mam dwa formularze:
Form1 wyświetla listę
Form2 dodaje elementy do listy
lista to po prostu zwykła lista z elementami typu string np imiona. Nie mieszajmy na razie z obiektami dla ułatwienia.
Jak to powinno poprawnie wyglądać?

1
specjal1990 napisał(a):

Chyba czegoś tutaj nie potrafie zrozumieć i jestem w martwym punkcie.
Może dla ułatwienia zrozumienia tego uprośćmy sobie problem.
Mam dwa formularze:
Form1 wyświetla listę
Form2 dodaje elementy do listy
lista to po prostu zwykła lista z elementami typu string np imiona. Nie mieszajmy na razie z obiektami dla ułatwienia.
Jak to powinno poprawnie wyglądać?

Cokolwiek byśmy ci tu napisali, że powinieneś zrobić, ale nie napiszemy gotowca - nie jesteś w stanie tego przełożyć na kod.
Kopiujesz jakieś fragmenty, ale nie umiesz tego niby własnego kodu przeczytać, nie rozumiesz, bo nie znasz podstaw.

Zostaw te Formy, bo nic na tym nie zrozumiesz, zacznij coś podstawego.
Zanim zagrasz IX symfonię, musisz poznać nuty i akordy, nie ma innej ścieżki

Z tym że to ci niewiele pomoże, bo jak wiesz który wiersz i masz komunikat i nadal nie wiesz jak poprawić to musisz wrócić do podstaw, czyli jakiś kurs z podstawami. — _13th_Dragon 27 minut temu

Nie da sie tego dokładniej powiedzieć

0

Ok rozumiem. Chciałem po prostu uczyć się robiąc jakiś praktyczny program.Bo czytanie kursów, oglądanie kursów na youtubie jakoś nie pozwala mi wszystkiego zapamiętać a raczej wolę to przepraktykować w jakimś wymyślonym swoim problemie. Za zadanie sobie postawilem zrobić aplikacje z rachunkami domowymi. I w aplikacji konsolowej w miarę to ogarnąłem. Dodaje rachunki, mogę je przeglądać, przeglądać dany miesiąc itp. Wszystkie dane zapisują się w pliku. I myślałem że po prostu fajnie było by to jakoś ładniej wyświetlać niż w konsoli dlatego zacząłem te Formy.

1

Ja uważam, że masz w tej chwili GIGANTYCZNY kłopot. Nie umiesz dzielić problemu na logiczne fragmenty i na nich operować. Powinieneś wziąć najmniejszy możliwy przykład który spróbuje wykonać dokładnie tą operacje z którą masz kłopoty, nic więcej.

0

Może to wyglądać jakoś tak:

    public partial class StringEditForm : Form
    {
        private StringEditForm()
        {
            InitializeComponent();
        }
        public static bool Execute(ref string value)                 //*
        {                                                            //*
            StringEditForm form=new StringEditForm();                //*
            form.TbString.Text=value;                                //*
            bool ok=(form.ShowDialog()==DialogResult.OK);            //*
            if(ok) value=form.TbString.Text;                         //*
            return ok;                                               //*
        }                                                            //*
    }
    partial class StringEditForm
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        private void InitializeComponent()
        {
            this.TbString = new System.Windows.Forms.TextBox();
            this.BtnCancel = new System.Windows.Forms.Button();
            this.BtnAccept = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // TbString
            // 
            this.TbString.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.TbString.Location = new System.Drawing.Point(12, 12);
            this.TbString.Name = "TbString";
            this.TbString.Size = new System.Drawing.Size(596, 22);
            this.TbString.TabIndex = 0;
            // 
            // BtnCancel
            // 
            this.BtnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
            this.BtnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
            this.BtnCancel.Location = new System.Drawing.Point(12, 56);
            this.BtnCancel.Name = "BtnCancel";
            this.BtnCancel.Size = new System.Drawing.Size(75, 25);
            this.BtnCancel.TabIndex = 1;
            this.BtnCancel.Text = "Rezygnuj";
            this.BtnCancel.UseVisualStyleBackColor = true;
            // 
            // BtnAccept
            // 
            this.BtnAccept.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
            this.BtnAccept.DialogResult = System.Windows.Forms.DialogResult.OK;
            this.BtnAccept.Location = new System.Drawing.Point(533, 56);
            this.BtnAccept.Name = "BtnAccept";
            this.BtnAccept.Size = new System.Drawing.Size(75, 25);
            this.BtnAccept.TabIndex = 2;
            this.BtnAccept.Text = "Akceptuj";
            this.BtnAccept.UseVisualStyleBackColor = true;
            // 
            // StringEditForm
            // 
            this.AcceptButton = this.BtnAccept;
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.CancelButton = this.BtnCancel;
            this.ClientSize = new System.Drawing.Size(620, 93);
            this.Controls.Add(this.BtnAccept);
            this.Controls.Add(this.BtnCancel);
            this.Controls.Add(this.TbString);
            this.Name = "StringEditForm";
            this.Text = "Edycja napisu";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.TextBox TbString;
        private System.Windows.Forms.Button BtnCancel;
        private System.Windows.Forms.Button BtnAccept;
    }
    public partial class StringsForm : Form
    {
        private BindingList<String> strings=new BindingList<String>();               //*
        public StringsForm()
        {
            InitializeComponent();
            LbStrings.DataSource=strings;                                            //*
        }

        private void BtnAdd_Click(object sender, EventArgs e)
        {
            string value="nowy";                                                     //*
            if(StringEditForm.Execute(ref value)) strings.Add(value);                //*
            BtnEdit.Enabled=true;                                                    //*
        }

        private void BtnEdit_Click(object sender, EventArgs e)
        {
            int idx=LbStrings.SelectedIndex;                                         //*
            if(idx>=0)                                                               //*
            {                                                                        //*
                string value=strings[idx];                                           //*
                if (StringEditForm.Execute(ref value)) strings[idx]=value;           //*
            }                                                                        //*
        }
    }
    partial class StringsForm
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Kod generowany przez Projektanta formularzy systemu Windows

        private void InitializeComponent()
        {
            this.LbStrings = new System.Windows.Forms.ListBox();
            this.BtnAdd = new System.Windows.Forms.Button();
            this.BtnEdit = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // LbStrings
            // 
            this.LbStrings.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
            | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.LbStrings.FormattingEnabled = true;
            this.LbStrings.ItemHeight = 16;
            this.LbStrings.Location = new System.Drawing.Point(12, 12);
            this.LbStrings.Name = "LbStrings";
            this.LbStrings.Size = new System.Drawing.Size(776, 388);
            this.LbStrings.TabIndex = 0;
            // 
            // BtnAdd
            // 
            this.BtnAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
            this.BtnAdd.Location = new System.Drawing.Point(12, 415);
            this.BtnAdd.Name = "BtnAdd";
            this.BtnAdd.Size = new System.Drawing.Size(75, 23);
            this.BtnAdd.TabIndex = 1;
            this.BtnAdd.Text = "Dodaj";
            this.BtnAdd.UseVisualStyleBackColor = true;
            this.BtnAdd.Click += new System.EventHandler(this.BtnAdd_Click);
            // 
            // BtnEdit
            // 
            this.BtnEdit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.BtnEdit.Enabled = false;
            this.BtnEdit.Location = new System.Drawing.Point(713, 415);
            this.BtnEdit.Name = "BtnEdit";
            this.BtnEdit.Size = new System.Drawing.Size(75, 23);
            this.BtnEdit.TabIndex = 2;
            this.BtnEdit.Text = "Edytuj";
            this.BtnEdit.UseVisualStyleBackColor = true;
            this.BtnEdit.Click += new System.EventHandler(this.BtnEdit_Click);
            // 
            // StringsForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 450);
            this.Controls.Add(this.BtnEdit);
            this.Controls.Add(this.BtnAdd);
            this.Controls.Add(this.LbStrings);
            this.Name = "StringsForm";
            this.Text = "Lista napisów";
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.ListBox LbStrings;
        private System.Windows.Forms.Button BtnAdd;
        private System.Windows.Forms.Button BtnEdit;
    }
1
specjal1990 napisał(a):

Za zadanie sobie postawilem zrobić aplikacje z rachunkami domowymi. I w aplikacji konsolowej w miarę to ogarnąłem. Dodaje rachunki, mogę je przeglądać, przeglądać dany miesiąc itp. Wszystkie dane zapisują się w pliku. I myślałem że po prostu fajnie było by to jakoś ładniej wyświetlać niż w konsoli dlatego zacząłem te Formy.

Niech zgadnę ...

Konsolową apkę zrobiłes (przyjmuję za prawdę, że działa) w 100% w stylu proceduralnym, pewnie z metodami static - mniemanie oparte czysto na statystyce z problemów początkujących, jak i twoimi problemami tutaj. Wiele tzw "kursów z YT" robi pod tym wzgledem krzywdę.

Niestety, nie mam pod ręką jakiegoś kursu, o którym wiem, że wejście w OOP jest poprawne a zarazem przystępne, nie zajmuję sie tym, ale czegoś takiego potrzebujesz.

0
specjal1990 napisał(a):

Ok rozumiem. Chciałem po prostu uczyć się robiąc jakiś praktyczny program.Bo czytanie kursów, oglądanie kursów na youtubie jakoś nie pozwala mi wszystkiego zapamiętać a raczej wolę to przepraktykować w jakimś wymyślonym swoim problemie. Za zadanie sobie postawilem zrobić aplikacje z rachunkami domowymi. I w aplikacji konsolowej w miarę to ogarnąłem. Dodaje rachunki, mogę je przeglądać, przeglądać dany miesiąc itp. Wszystkie dane zapisują się w pliku. I myślałem że po prostu fajnie było by to jakoś ładniej wyświetlać niż w konsoli dlatego zacząłem te Formy.

Hm. Nie chcę być natrętny strasznie skomplikowanie to wygląda. Patrzyłeś czy nie prościej by było w Borland C++ Builder 6.0? Kiedyś w tym sporo pisałem i nie miałem żadnych problemów, wydaje mi się, że jest dużo prostszy. Na początek żeby ogarnąć podstawy myślę, że byłby dla Ciebie lepszy. I masz też do pomocy tą stronkę cyfrowego barona, tam po polsku wszystko wytłumaczone.

0

@infinityhost:

Że wyklepie jak małpa coś, co być może zadziała (bez złośliwych testów), to prawda.
Że zrozumie coś wartościowego na Builderze - bez szans.

@specjal1990:
Musisz rozumieć, że ten kolega ma swoje wąskie wizje, a rzeczona platforma to muzeum.

1

Nie wiem jak ocenić w ilu % moja aplikacja jest w stylu proceduralnym... Aczkolwiek starałem się ją robić w jakimś stopniu obiektowym. Tzn zrobiłem klasę gdzie definiuje rachunek itp. A w niej metody odpowiedzialne za wyświetlanie/ wprowadzanie danych. Tak jak pisałem robie to aby uczyć się i staram się w jakimś stopniu zrozumieć obiektowość C#.

1
specjal1990 napisał(a):

Nie wiem jak ocenić w ilu % moja aplikacja jest w stylu proceduralnym... Aczkolwiek starałem się ją robić w jakimś stopniu obiektowym. Tzn zrobiłem klasę gdzie definiuje rachunek itp. A w niej metody odpowiedzialne za wyświetlanie/ wprowadzanie danych. Tak jak pisałem robie to aby uczyć się i staram się w jakimś stopniu zrozumieć obiektowość C#.

Generalnie, żeby sobie poradzić z problemami we współczesnym GUI, płynne oswojenie z obiektami jest, osobiscie sądzę, konieczne. Ten watek przykładem.
Płynne - co nie znaczy doskonałe - ale takie ze przy obiekcie się nie poci człowiek z wysiłku "o kurcze, jeszcze muszę obiekt", tylko idą mu naturalnie, umie słowa wiazać w zdania itd... jak z językiem obcym

1

Ok uświadomiliście mnie że jestem na poziomie poniżej początkującego.. Czytając kursy, książki mam wrażenie że rozumiem idee obiektowości. Ale być może przy pisaniu aplikacji jakoś ta wiedza nie jest używana...? Może macie jakieś ciekawe ćwiczenia w których mógłbym zagłebić się w tajniki obiektowości tak aby wiedza o niej potem była używana przeze mnie automatycznie?

0

@ZrobieDobrze: w 2000 chyba używałem visual studio i chyba rok, czy dwa później przesiadłem na buildera. Raczej nie bez powodu. Miałem kupę satysfakcji z tego co robiłem i nie potrzebowałem niczyjej pomocy więc nie wiem co Ci się w nim nie podoba. Dla mnie jednym z bardziej kluczowych spraw jest czas a to co co napisał 13_dragon nie wygląda na coś co się szybko klepie. "Generalnie, żeby sobie poradzić z problemami we współczesnym GUI" - no rozwalasz mnie, problemy? Traktujesz elementy programowania jako problemy? Ktoś tak to wymyślił, żeby to było problemem? Jak ja zacznę widzieć w programowaniu "problemy" to usunę z dysku wszystkie kompilatory i zacznę szydełkować. xD Generalnie żeby zrozumieć w idealny sposób Twój punkt widzenia, potrzebuję zrozumieć, czemu nie używasz słów "muszę,musi,musieć,musiałem"...wtedy byłbyś bardziej przekonywujący uważam.xD ale dzięki za informację, że jak wyjdę z "muzeum" to będę miał problemy..
@specjal1990: A jak wygląda struktura w której chcesz przechowywać informacje (teksty jeśli to jakie , liczby jeśli to jakie, struktury jeśli to jakie)? Ładujesz to do jakiejś kontrolki w projekcie? Jak to wyglądało w konsolowej wersji? Z jakich materiałów się uczysz?
Tak z ciekawości pytam, nie zamierzam Ci podkraść tego pomysłu. Po prostu ciekawi mnie z jakiego poziomu można startować z programowaniem i gdzie potem człowiek może zacząć się gubić. Przeszedłem proces nauczania od samego początku i jest to dla mnie ciekawy temat, możesz uznać, że jestem po części badaczem. I absolutnie nie czuj się jako ... obiekt.

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