[ bigguy @ 18.02.2009. 13:06 ] @
Da li je moguce da na osnovu stanja u bazi na MAIN formi se pojavljuje ili ne pojavljuje CheckBox, a da pritom taj CheckBox nisam ja prevukao na formu i njegovu vidljivost regulisao preko Visible, nego njegovo postojanje korisnik regulise? Prost primer: Imam upitnu formu za korisnika u kojoj on treba da upise u TextBox "0" ili "1", a zatim pritiskom dugmeta OK trebalo bi da se otvori nova forma, prazna ako je odabrana "0" i forma sa CheckBox-om i tekstom u checkBox-u koji glasi "USPEH" ako je odabrana "1". Imali neko ideju kako da kreiram ovu mogucnost za korisnika, da on ustvari odredjuje sta ce biti na formi?
[ vujkev @ 18.02.2009. 13:26 ] @
Code:
If nesto = 1 then
        Dim ch As New CheckBox
        ch.Text = "USPEH"
        ch.Top = 11
        ch.Left = 50
        ' itd ....
        Me.Controls.Add(ch)
end if 
[ bigguy @ 18.02.2009. 18:27 ] @
C# je jezik, ali iz ovoga sto si ovde naveo mislim da nesto kontam, ali moracu prvo da probam. Ovo mi deluje dosta jednostavno, razmisljao sam na jedan drugi nacin (mnogo komplikovaniji) a mozda se bas u ovoj jednostavnosti krije i odgovor Nista ostaje mi da probam pa cu saznati sve.
[ vujkev @ 18.02.2009. 23:01 ] @
koristan link http://www.developerfusion.com/tools/convert/csharp-to-vb/
[ milan1233 @ 19.02.2009. 11:27 ] @
Evo ja da ne otvaram novu temu, nadovezacu se na ovu:

Treba mi kod (vb) za prevlacenje itema (npr. ovog gore checkboxa) po formi, tzv. drag n drop?
[ bigguy @ 20.02.2009. 09:22 ] @
Ok, uspeo sam da napravim da korisnik moze sam da kreira CheckBox. Ali kako sad ja da omogucim da ukoliko korisnik CheckBox postavi na stanje true da mi se tada npr. pojavi label.Text "RADI!"?
[ marko1981 @ 20.02.2009. 09:53 ] @
Moras da dodas EventHandler metodu na dogadjaj.

Code:

CheckBox chk = new CheckBox();
//...
chk.CheckedChanged += new System.EventHandler(this.chk_CheckedChanged);


Code:


private void chk_CheckedChanged(object sender, EventArgs e)
{    
    // na primer
    lbl.Text = ((CheckBox)sender).Checked ? "Radi" : "Ne radi";
}


U konstruktoru forme sigurno imas poziv metode InitializeComponent(). Njena definicija se nalazi u fajlu ImeForme.Designer.cs. Kad nesto dodas/promenis u design modu, upisace se u ovaj fajl. Proanaliziraj ovaj fajl, moze ti biti korisno.
[ bigguy @ 20.02.2009. 10:57 ] @
Ok, to sam skontao ali meni ustvari nastaje problem kada generisem u istom momentu i label i checkBox. Tada label treba da zavisi od toga da li je checkBox na true ili na false. Izgleda da nisam predhodno pitanje dobro formulisao. :-/
[ marko1981 @ 20.02.2009. 11:08 ] @
Daj kod koji ti pravi problem.
[ bigguy @ 20.02.2009. 11:19 ] @
private void Form1_Load(object sender, EventArgs e)
{
//TODO: This line of code loads data into the 'dsObradaUzorka.tblObradaUzorka' table. You can move, or remove it, as needed.
this.tblObradaUzorkaTableAdapter.Fill(this.dsObradaUzorka.tblObradaUzorka);

Class1 conn1 = new Class1();
conn1.setSqlConnection();

clsFunc.odredjivanje_TotalRow("tblAnalize");

for (int i = 0; i <= clsVariables.sTotalRow; i++)
{
if (i != 0)
{
if (clsVariables.sAnaliza != "")
{
clsFunc.citanje_Podataka(i, "tblAnalize");

CheckBox ckb = new CheckBox();
ckb.AutoSize = true;
ckb.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
ckb.Location = new System.Drawing.Point(clsVariables.sX, clsVariables.sY);
ckb.Name = "checkBox" + clsVariables.sID;
ckb.Text = clsVariables.sAnaliza;
ckb.UseVisualStyleBackColor = true;
ckb.CheckedChanged += new System.EventHandler(this.ckb_CheckedChanged);
this.Controls.Add(ckb);

ComboBox cmb = new ComboBox();
cmb.DataSource = this.tblObradaUzorkaBindingSource;
cmb.DisplayMember = "Uređaj za obradu";
cmb.FormattingEnabled = true;
cmb.Location = new System.Drawing.Point(143, 389);
cmb.Name = "cmbUredjaj" + clsVariables.sID;
cmb.Size = new System.Drawing.Size(121, 21);
cmb.ValueMember = "ID";
cmb.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.cmb_KeyPress);
this.Controls.Add(cmb);
}
}
}
}

Kako sada da Enabled ovako nastalog ComboBox-a zavisi od stanja pre njega nastalog CheckBox-a? E, to mi je problem jer oblast postojanja objekta cmb prestaje u okviru funkcije Form1_Load.
[ marko1981 @ 20.02.2009. 11:35 ] @
Citat:

...oblast postojanja objekta cmb prestaje u okviru funkcije Form1_Load...


Da, u smislu pristupanja navodjenjem imena kontrole. Kontrola postoji sa svojim imenom, ali nemas lokalnu promenljivu u klasi forme koja se zove ckb.

Imas bar 2 nacina da ovo resis.

Prvi je da napravis u Form.cs klasi lokalnu promenljivu CheckBox ckb ...

Code:

// Form1.cs:

private ComboBox cmb = null;


... a da je u Load metodi samo inicijalizujes. Posle bi mogao da joj pristupis kao sto verovatno sad pokusavas.

Znaci, ne bi bilo:

Code:

ComboBox cmb = new ComboBox();
// ...


nego

Code:

this.cmb = new ComboBox();
// ...


Drugi je da CheckBox kontrolu ckb trazis pomocu

Code:

Controls[] controls = this.Controls.Find("ckb", true);
if (controls.Length > 0)
{
   CheckBox chkBox = controls[0];
}


Ja sam za prvo resenje.

Btw. Kad ubacujes kod u odgovor, stavi ga izmedju tagova, dosta je preglednije.

[Ovu poruku je menjao marko1981 dana 20.02.2009. u 13:49 GMT+1]
[ bigguy @ 20.02.2009. 11:56 ] @
Ali sada i kada sam napravio lokalnu promenjivu cmb ja ne mogu njen enabled da kontrolisem.
Koristio sam [cmb.Enabled = ((CheckBox)sender).Checked ? true : false;]
[ marko1981 @ 20.02.2009. 12:01 ] @
Moras napisati kakvu poruku dobijas.

Jel ne mozes da build-ujes kod ili ti pukne program kad naidje na ovaj red?
[ bigguy @ 20.02.2009. 12:10 ] @
Pazi on prodje kroz kod i pogledao sam u Watch prozoru on iz toga reda dobija true kao vrednost ali se nista ne desava na formi. Sve sljaka ali bez rezultata. Da zaboravih da kazem da se taj kod nalazi unutar funkcije ckb_CheckedChanged.
[ marko1981 @ 20.02.2009. 12:17 ] @
Tek sad sam video da ti u for petlji pravis vise kontrola, a ne samo jednu.

Ovo je za Control.ControlCollection.Find() metodu koju smo pomenuli, a za parametar postavljaj ime koje, takodje vidim, ti kreiras preko:

Code:

// ...
ckb.Name = "checkBox" + clsVariables.sID;
cmb.Name = "cmbUredjaj" + clsVariables.sID;
// ...


A ovo za lokalnu promenljivu u ovom slucaju zaboravi.


[ marko1981 @ 20.02.2009. 12:22 ] @
Kad ti dodas kroz design neku kontrolu i ona automatski dobije ime, recimo Label1, property Name takodje postaje Label1.

Ti ovde sam postavljas Name i to iskoristi da pristupis odredjenoj kontroli u nizu kontrola.
[ bigguy @ 20.02.2009. 12:29 ] @
Mozesli ovu metodu malo da mi pojasnis? Ne razumem kako preko nje da kontrolisem stanje cmb.enabled u zavisnosti od toga da li je ckb.Checked na true/false? Takodje, ne razumem da li bi onda to znacilo da bi takav kod trebalo ubaciti u funkciju ckb_CheckedChanged?
[ marko1981 @ 20.02.2009. 12:36 ] @
Mozda ima neka greska posto kucam direktno ovde, ali shvatices verovatno ideju.

Code:

private void chk_CheckedChanged(object sender, EventArgs e)
{    
    CheckBox chk = (CheckBox)sender;

    string name = chk.Name;
    string id = name.Substring("checkBox".Length);

    string comboBoxName = string.Format("cmbUredjaj{0}", id);

    Controls[] cntrls = this.Controls.Find(comboBoxName, true);
    if (cntrls.Length > 0)
    {
        ((ComboBox)cntrls[0]).Enabled = chk.Checked;
    }
}


[Ovu poruku je menjao marko1981 dana 20.02.2009. u 13:49 GMT+1]
[ bigguy @ 20.02.2009. 12:45 ] @
Ne moze da ga pokrene za uslov if prijavljuje: Operator '>' cannot be applied to operands of type 'method group' and 'int'
[ marko1981 @ 20.02.2009. 12:48 ] @
Izvini, kucao sam direktno ovde, a ne u VS.

Nije Count, nego Length.
[ bigguy @ 20.02.2009. 12:52 ] @
Proradilo :) Hvala puno. Moracu da pogledam malo detaljnije ovaj kod jer mi sad jos nije bas sve najjasnije kako radi ali bitno je za sad da sljaka.
[ bigguy @ 24.02.2009. 09:37 ] @
Evo vec novog problema. Naime, objekte sam formirao na sledeci nacin:
Code:

        private void Form1_Load(object sender, EventArgs e)
        {
            clsFunc.odredjivanje_TotalRow("tblAnalizeBiohemije");

            for (int i = 0; i <= clsVariables.sTotalRow; i++)
            {
                if (i != 0)
                {
                    if (clsVariables.sAnaliza != "")
                    {
                        clsFunc.citanje_Podataka(i, "tblAnalizeBiohemije");

                        Label lblStanje = new Label();
                        lblStanje.AutoSize = true;
                        lblStanje.Location = new System.Drawing.Point(clsVariables.sXlabelStanje, clsVariables.sYlabelStanje);
                        lblStanje.Name = "labelStanje" + clsVariables.sID;
                        lblStanje.Size = new System.Drawing.Size(35, 13);
                        this.Controls.Add(lblStanje);

                        TextBox txt = new TextBox();
                        txt.Enabled = false;
                        txt.Location = new System.Drawing.Point(clsVariables.sXtextBox, clsVariables.sYtextBox);
                        txt.Name = "textBox" + clsVariables.sID;
                        txt.Size = new System.Drawing.Size(100, 20);
                        this.Controls.Add(txt);
                    }
                }
            }
        }
  


A sad imam problem kako da omogucim da kada se upise neka vrednost u TextBox, tekst Label-e lblStanje zavisi od vrednosti upisane u odredjeni TextBox. Npr., imam dva TextBoxa kreirana na ovaj nacin, TextBox1 i TextBox2, i njihove granicne vrednosti su za prvi 1 i 5, a za drugi 2 i 6. Ukoliko korisnik upise u TextBox1 vrednost 3, onda je lblSatnje.Text = "", a ukoliko u TextBox2 upise vrednost 8, onda je lblStanje.Text = "HIGH". Rezultate upisa, odnosno stanje lblStanje.Text, je potrebno videti odmah napustanja polja vazenja TextBox-a. Imali neko ideju kako ovaj problem da prebrodim?
[ deerbeer @ 24.02.2009. 13:12 ] @
Pa nesto otprilike ovako :
Posle kreiranja textboxa dodaj i event Leave na njegov objekat .
Code:

TextBox txt = new TextBox();
txt.Enabled = false;
//dodaj
txt .Leave += new System.EventHandler(txt_Leave);

Negde u klasi definisi funkciju za event handler u kojoj ces proveravati
sa kog textbox-a je korisnik presao (Leave event) i kroz switch
ces obradjivati za svaki ponaosob

Code:
 
private void txt_Leave(object sender, EventArgs e)
{
 TextBox txt = (TextBox)sender;

 switch (txt.Name)
 {
     case "textBox1" : 
          //ovde ispisuj u odgovarajucu labele .. 
         break; 

     case "textBox2" :
           //ovde ispisuj u odgovarajucu labele ..     
          break;   
  }
}



ili mozda bolje ovako da izgleda handler za tvoj leave event :
zbog ovog niza gde cuvas neke ID-ijeve :

Code:
 
private void txt_Leave(object sender, EventArgs e)
{
 TextBox txt = (TextBox)sender;
 for (int i = 0; i <= clsVariables.sTotalRow; i++)
 {
    if (txt.Name == "textBox" + clsVariables.sID) 
     { 
      Control [] cs = Controls.Find("labelStanje" + clsVariables.sID,true) 
      if (cs.Length > 0 ) 
        {
           Label l = (Label)cs[0] ; 
           l.Text = "ispisi u odgovarajucu labelu" ; 

         } 
      
     }


 } 

}








[Ovu poruku je menjao deerbeer dana 24.02.2009. u 14:23 GMT+1]

[Ovu poruku je menjao deerbeer dana 24.02.2009. u 14:25 GMT+1]
[ Igor Gajic @ 24.02.2009. 14:56 ] @
Ili Leave definises preko:

Code:

            textBox1.Leave+=new EventHandler((sender,e)=> {
                                                                TextBox txt = (TextBox)sender;

                                                                switch (txt.Name)
                                                                {
                                                                    case "textBox1":
                                                                        //ovde ispisuj u odgovarajucu labele .. 
                                                                        break;

                                                                    case "textBox2":
                                                                        //ovde ispisuj u odgovarajucu labele ..     
                                                                        break;
                                                                }           
            });



tako da ti je sav kod oko definisanja novog textBox-a na jednom mestu da se ne cimas oko odrzavanja.

Ali ovo je vec stvar licnih preferenci....

[ bigguy @ 25.02.2009. 09:06 ] @
Deerbeer-ovo drugo ponudjeno resenje je imalo donekle smisla. Kazem donekle, jer sam morao da promenim lokaciju kreiranja objekta lblStanje. Stvar je u tome da ja ustvari korisniku ostavljam mogucnost da sam kreira koliko hoce TexBox-ova na osnovu jedne predhodne forme (FormUpis) gde on definise granice i naziv analize koji se potom skladiste u bazi. Pozicija elemenata na drugoj formi (Form1) se automatski izracunavaju na osnovu predhodno upisane analize. Nakon zatvaranja te FormUpis otvara se forma Form1, koja je ustvari prazna (ustvari ima samo jedan button OK) a elementi na njoj se generisu kreiranjem objekata preko funkcije Form1_Load. Razmisljajuci skontao sam da ustvari lblStanje ne treba da kreiram u okviru Form1_Load jer je ona ustvari posledica upisa u TextBox pa sam odlucio da je kreiram i postavim uslove, na osnovu drugog ponudjenog koda deerbeer-a, u okviru funkcije txt_Leave. I zamislite proradilo je
Ali odmah se javio i problem
Najbolje je da problem objasnim preko primera. Npr., korisnik je kreirao 3 analize i upisao njihove granicne vrednosti, sto znaci da u Form1 se kreiraju i 3 TextBox-a za upis dobijenih vrednosti. Kada upisem vrednosti u sva tri TextBox-a on mi ispise lblStanje za sve tri vrednosti ispravno. Ali kada se vratim i pokusam vrednosti da korigujem (ako je bila prva vrednost LOW, onda neku vrednost koja je HIGH) onda se nista ne desava, to jest nema promene kod lblStanje.Text. Pracenjem realizacije funkcije txt_Leave video sam da on ustvari promene u TextBox-ovima ne primecuje jer pamti zadnju unetu vrednost.
Moje pitanje se svodi na to kako bi mogao da omogucim korekciju jednom unetih vrednosti i kako da omogucim da se te vrednosti upisane u TextBox-ove uskladiste u bazu?
Evo i koda:
Code:

            clsFunc.odredjivanje_TotalRow("tblAnalizeBiohemije");

            for (int i = 0; i <= clsVariables.sTotalRow; i++)
            {
                if (i != 0)
                {
                    if (clsVariables.sAnaliza != "")
                    {
                        clsFunc.citanje_Podataka(i, "tblAnalizeBiohemije");

                        Label lbl = new Label();
                        lbl.AutoSize = true;
                        lbl.Location = new System.Drawing.Point(clsVariables.sXlabelID, clsVariables.sYlabelID);
                        lbl.Name = "labelID" + clsVariables.sID;
                        lbl.Size = new System.Drawing.Size(35, 13);
                        lbl.Text = clsVariables.sID + ".";
                        this.Controls.Add(lbl);

                        CheckBox ckb = new CheckBox();
                        ckb.AutoSize = true;
                        ckb.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                        ckb.Location = new System.Drawing.Point(clsVariables.sXcheckBox, clsVariables.sYcheckBox);
                        ckb.Name = "checkBox" + clsVariables.sID;
                        ckb.Text = clsVariables.sAnaliza;
                        ckb.UseVisualStyleBackColor = true;
                        ckb.CheckedChanged += new System.EventHandler(this.ckb_CheckedChanged);
                        this.Controls.Add(ckb);

                        TextBox txt = new TextBox();
                        txt.Text = "";
                        txt.Enabled = false;
                        txt.Location = new System.Drawing.Point(clsVariables.sXtextBox, clsVariables.sYtextBox);
                        txt.Name = "textBox" + clsVariables.sID;
                        txt.Size = new System.Drawing.Size(100, 20);
                        txt.MouseLeave += new System.EventHandler(this.txt_Leave);
                        this.Controls.Add(txt);
                    }
                }
            }
        }

        private void txt_Leave(object sender, EventArgs e)
        {
            TextBox txt = (TextBox)sender;
            string name = txt.Name;
            string stringid = name.Substring("textBox".Length);
            int id = int.Parse(stringid, System.Globalization.CultureInfo.InvariantCulture);

            clsFunc.citanje_Podataka(id, "tblAnalizeBiohemije");

            Label lblStanje = new Label();
            lblStanje.AutoSize = true;
            lblStanje.Location = new System.Drawing.Point(clsVariables.sXlabelStanje, clsVariables.sYlabelStanje);
            lblStanje.Name = "labelStanje" + clsVariables.sID;
            lblStanje.Size = new System.Drawing.Size(35, 13);
            this.Controls.Add(lblStanje);

            for (int i = 0; i <= id; i++)
            {
                if (txt.Name != "textBox" + i)
                { }
                else
                {
                    Control[] cs = Controls.Find("labelStanje" + i, true);
                    if (cs.Length < 0)
                    { }
                    else
                    {
                        if (txt.Text == "")
                        {
                            MessageBox.Show("GRESKA!");
                        }
                        else
                        {
                            decimal Stanje = decimal.Parse(txt.Text, System.Globalization.CultureInfo.InvariantCulture);
                            if (Stanje > clsVariables.sGornja)
                            {
                                lblStanje.Text = "HIGH";
                            }
                            else
                            {
                                if (Stanje < clsVariables.sDonja)
                                {
                                    lblStanje.Text = "LOW";
                                }
                                else
                                {
                                    lblStanje.Enabled = false;
                                }
                            }
                        }
                    }
                }
            } 
        }
[ deerbeer @ 25.02.2009. 10:37 ] @
Citat:

Pracenjem realizacije funkcije txt_Leave video sam da on ustvari promene u TextBox-ovima ne primecuje jer pamti zadnju unetu vrednost.

Leave event se okida kada textbox izgubi fokus ..tako da bi labela trebala da se update-uje samo kad predjes na drugi textbox .
Ako hoces automatsko menjanje labele pri promeni vrednosti u textboxu onda hendluj event KeyUp na slican nacin kao i Leave ..
[ bigguy @ 25.02.2009. 11:28 ] @
To mi ne resava problem. Meni je potrebno da nekako pronadjem nacin da mu kazem u koju od labela tekst da smesti i da pritom predhodni tekst labele obrise.
[ bigguy @ 25.02.2009. 12:02 ] @
Upravo sam razmatrao tok funkcije txt_Leave kada se menjaju vrednosti u TextBox-u i vidim ustvari da do zabune dolazi posto se kreiraju dva ista objekta Label sa istim Name. Meni je potrebno znaci ili da brisem odredjeni objekat pa kreiram novi umesto njega (sto mislim da je laksi nacin), ili da nadjem nacina da pristupim kreiranom objektu Label odredjenog Name i potom vrsim izmenu postojeceg teksta. Imali ideju neko kako je to moguce postici?