» »

C# okna in podokna

C# okna in podokna

brinovcek ::

Pozdravljeni !

Imam malo komplikacij pri izdelavi aplikacije ki vnaša v bazo podatke o zaposljenih. Ko se aplikacija zažene imam glavno okno , ki je MdiParent, saj želim da so vsa okna znotraj mojega vsebnika. Ko v orodni vrstici odprem podokno pregled se mi ta lepo odpre vendar in ob kliku na gumb Nov(nov uporabnik) se mi zapre ter odpre popolnoma novo okno, ki je namenjeno vnašanju zaposljenega v bazo. Ko shranimo zaposljenga se okno zapre, tukaj pa nastane problem, za katerega bi prosil vašo pomoč : Želim ponovno odpreti podokno pregled v glavnem obrazcu (Form1), zanima me kako bi se glasil klic tega podokna v glavnem oknu, probal sem ze na vse možne načine pa mi ne uspe.
Koda iz gumba, ki bi moral odpreti nov obrazec:

   ///
            /// VNOS PODATKOV V PODATKOVNO BAZO
            /// 

            OleDbConnection con = null;
            OleDbCommand vstavi = null;

            string dodaj = "INSERT INTO Delavec (Ime,Priimek,Maticna,Telefon,Aktiven)VALUES(@i,@p,@m,@s,@a)";

            con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" +
            "Data Source=C://Documents and Settings/student/My Documents/Visual Studio 2008/Projects/Aplikacija/Aplikacija/Baza.accdb");

            try
            {
                con.Open();//odpremo bazo 
                vstavi = new OleDbCommand(dodaj, con);
                vstavi.Parameters.AddWithValue("@i",textBox1.Text );//podamo parametere za vnos podatkov  
                vstavi.Parameters.AddWithValue("@p",textBox2.Text );
                vstavi.Parameters.AddWithValue("@m", textBox3.Text);
                vstavi.Parameters.AddWithValue("@s", textBox4.Text);
                if(aktiven.Checked){
                    //vnesi 1 
                    vstavi.Parameters.AddWithValue("@a",true);
                }else{
                    //vnesi 0
                     vstavi.Parameters.AddWithValue("@a",false);
                }
                
                vstavi.ExecuteNonQuery();//izvedemo zapis 
                vstavi.Parameters.Clear();//počistimo parametre
                vstavi.Dispose();

            }
            catch (Exception a)
            {
                MessageBox.Show("Napaka!\n" + a.Message + "\n" + a.Source);
                throw;
            }
            finally
            {
                con.Close();    //zapremo povezavo 
                this.Close();   //zapremo okno 
                MessageBox.Show("Zapis je bil dodan v bazo!");//sporaočilo ob uspešnem zapisu
               
                Pregled preg = new Pregled();
                Form1 f1 = new Form1();
                preg.MdiParent = f1;
                preg.Show();
            }  
  • spremenil: Senitel ()

Kekec ::

Kakor meni izgleda ti nardiš novo instanco Form1 v tem oknu kjer vpisujes podatke ... naj ugibam verjetno ko se zgornja metoda izvede se okno zapre .. seveda se s tem zapre ta na novo ustvarjena forma1, bo treba kar iz glavne forme nadzirat okna ne pa kar povprek imas moznost da glavna forma vidi kdaj si okno zaprl in naj nazaj odpre prejšnega ali pa iz tega obrazca obvestiš glavno formo naj nazaj osre prejsno :)

brinovcek ::

Bi mi mogoče lahko posredovali delček kode oz ukaza s katerim bi lahko to preverjal oz izvedel vaš predlog ...

Hvala

Kekec ::

Za začetek bi te usmeril na slovensko stran, ki premore precej brihtnih buč iz naše slovenije in ti bodo rade volje pomagali če jim boš postavil jasno vprašanje kot naprimer ta ki si ga zgoraj in sicer http://slodug.si/forums/.
lp

Monster ::

zakaj zapiras okno pregled? .. mogoce zato da imas ob ponovnem odprtju nove podatke?
Ka zaboga...

brinovcek ::

Rad bi jih imel... vendar zadeva ne dela kot sem si zamislil :( ima kdo kakšen predlog ?

Monster ::

na tvojem mestu bi proceduro ki napolni podatke v oknu "pregled" napisal v posebnem class-u. Okno za dodajanje bi uporabljal kot dialog. In ko bi kliknil dodaj, bi pokazal ta tvoj dialog in nebi zaprl okna "pregled". Ko bi zaprl dialog dodaj bi pognal to loceno proceduro in "refreshal" podatke v "pregledu"...

... za začetek si poglej uporabo dialogov v c#
Ka zaboga...

kitarist ::

Tudi jaz imam en problem. Imam okno, v katerega vnasam tocke s klikom (tocke lahko tudi generiram). Problem je v konstantnem osvezevanju okna, saj ko je na ekranu ogromno tock (vec kot 50000), se zadeva nenormalo upocasni. Sploh, ce imam kaksen messagebox preko okna. Torej, nareto imam tako, da naklikane(zgenerirane) tocke shranjujem v seznam tock, iz katerega pa se potem crpa izris.
Ali bi lahko naredil nekako tako, da bi ze izrisane tocke fiksno ostale na formi, ne pa da mi za vsako, novo dodano tocko, ponovno izrise vse.

jernejp ::

@KITARIST

Verjetno si naredil override onPaint metode. Poskusi na formo postaviti image in zgeneriraj prazen bitmap, ki ga prikazuje, nato ob klikih spreminjaj bitmap namesto da ob vsakem paintu rišeš pike.
Vzporedno pa lahko še hraniš array točk, če jih potrebuješ še za kaj drugega, da ti na koncu ni potrebno narediti scann bitmapa za pridobitev x/y araya.

Zgodovina sprememb…

  • spremenil: jernejp ()

kitarist ::

hvala, bom probal

FlashM ::

Tole s formami bi jst naredil tako: V kodi od container forme ali pa kar v classu Program.cs bi imel en Dictionary, ki bi za Key imel ime forme, za Value pa dejansko instanco forme:

IDictionary<string, Control> forms = new Dictionary<string, Control>();


Potem ko bi želel ustvarit novo instanco forme, bi najprej pogledal, če slučajno ta forma že obstaja v dictionary-ju in če obstaja bi jo samo prikazal, če pa še ne obstaja, bi naredil novo instanco te forme, jo dodal v dictionary in jo prikazal uporabniku. Seveda naj bo ta dictionary dosegljiv iz vseh ostalih form (za to lahko uporabiš en public property, za gettanje in settanje vrednosti dictionaryja).

FlashM ::

Recimo nekako takole (sicer je tole bolj kot ne pseudo koda, napisana v 5 minutah, samo za ponazoritev)

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

namespace MdiParent
{
    public enum FormsEnum
    {
        NEW_USER_FRM,
        NEW_ORDER_FRM
    }

    public partial class frmMdiContainer : Form
    {
        public IDictionary<FormsEnum, Form> forms = new Dictionary<FormsEnum, Form>();

        public frmMdiContainer()
        {
            InitializeComponent();
        }

        public void ShowForm(FormsEnum form, bool reinitialize)
        {
            if (forms.ContainsKey(form))
            {
                forms[form].Show();
            }
            else
            {
                forms[form] = CreateForm(form);
                forms[form].MdiParent = this;
                forms[form].Show();
            }

            if (reinitialize)
            {
                //Logika reinicializacije forme
            }
        }

        private Form CreateForm(FormsEnum form)
        {
            switch (form)
            {
                case FormsEnum.NEW_USER_FRM:
                    return new frmNewUser();
                case FormsEnum.NEW_ORDER_FRM:
                    return new frmNewOrder();
                default:
                    return null;
            }
        }

        private void newUserToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ShowForm(FormsEnum.NEW_USER_FRM, false);
        }

        private void newOrderToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ShowForm(FormsEnum.NEW_ORDER_FRM, false);
        }
    }
}


Vsaka forma bi pa morala imet override-an OnFormClosing event, da se dejansko forma ne bi zaprla, ampak samo skrila:

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

namespace MdiParent
{
    public partial class frmNewOrder : Form
    {
        public frmNewOrder()
        {
            InitializeComponent();
        }

        private void frmNewOrder_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (e.CloseReason == CloseReason.UserClosing)
            {
                e.Cancel = true;
                this.Hide();
            }
        }
    }
}


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

SQL problem

Oddelek: Programiranje
141536 (1154) win64
»

C# Pomoč

Oddelek: Programiranje
131315 (1140) jizzer
»

c# class

Oddelek: Programiranje
342156 (1750) japol
»

[C#] Dostop do objekta iz različnih form

Oddelek: Programiranje
182095 (1808) Kekec
»

[VB2005Pro]Zapiranje in še Eno uprasanje

Oddelek: Programiranje
81078 (1011) UltraTX

Več podobnih tem