Avatar billede hadaps Nybegynder
06. februar 2003 - 14:34 Der er 28 kommentarer og
2 løsninger

lave opbjecter i et loop

hvordan kan denne kode laves, så den automatisk laver 5 stk labels, som ligger ved siden af hinanden med hvert sit navn? eller kan man stille det op i en tabel som et html dokument?

------ Grundkode ------
For x = 1 To 5
Me.lbldate.Location = New System.Drawing.Point(120, 80)
Me.lbldate.Name = "lbldate11"
Me.lbldate.Size = New System.Drawing.Size(48, 40)
Me.lbldate.TabIndex = 1
Next


------ Havde tænk mig en lign kode for hver (bare med +50 til koordinater), men ved ikke om det kan lade sig gøre ------


For x = 1 To 5
Me.lbldate1.Location = New System.Drawing.Point(120, 80)
Me.lbldate1.Name = "lbldate1"
Me.lbldate1.Size = New System.Drawing.Size(48, 40)
Me.lbldate1.TabIndex = 1
Next
Avatar billede burningice Nybegynder
06. februar 2003 - 15:47 #1
uhm... det er for sure at der er fem labels hver gang?

så er det "bare" at gøre sådan her:

Label lblDate1;
Label lblDate2;
Label lblDate3;
Label lblDate4;
Label lblDate5;

for (int i = 0; i < 5; i++) {
string navn = "label"+ i;
int pos = (50*i)+80;
((Label)navn).Location = New System.Drawing.Point(120, pos)
((Label)navn).Name = navn
((Label)navn).Size = New System.Drawing.Size(48, 40)
((Label)navn).TabIndex = i
}
Avatar billede hadaps Nybegynder
06. februar 2003 - 17:32 #2
Ja, det er sikkert at der er 5 hver gang... Men er det du har lavet til VB.NET?
Avatar billede burningice Nybegynder
07. februar 2003 - 09:01 #3
nja... det er til c#... uhm... lad mig da lige prøve om jeg kan skrive det om til vb ;)

Dim lblDate1 As Label = new Label()
Dim lblDate2 As Label = new Label()
Dim lblDate3 As Label = new Label()
Dim lblDate4 As Label = new Label()
Dim lblDate5 As Label = new Label()

Dim i As Integer = 0
For i = 0 To 5
Dim navn As String = "lblDate"& i
Dim pos As Integer = (50*i)+80

((Label)navn).Location = New System.Drawing.Point(120, pos)
((Label)navn).Name = navn
((Label)navn).Size = New System.Drawing.Size(48, 40)
((Label)navn).TabIndex = i

Next
Avatar billede midas_dk Nybegynder
07. februar 2003 - 09:11 #4
Det der med ((Label)navn).whatever ser ikke helt VB.NETsk ud...

Jeg kigger lige hurtigt på det...
Avatar billede burningice Nybegynder
07. februar 2003 - 09:27 #5
midas>> det har du da også ret i... rodede lige lidt rundt på google og i VB.Net hedder det åbenbart CType... altså

CType(navn, Label).Location... osv.
Avatar billede midas_dk Nybegynder
07. februar 2003 - 11:03 #6
Hehe... Æv, der kom lige et møde i vejen!

Jeg nyder ellers at være translatør for cyberfessor og diverse andre C# gutter.

;-)
Avatar billede midas_dk Nybegynder
07. februar 2003 - 11:15 #7
- det er bare stadig ikke rigtigt... Man kan ikke uden videre konvertere en streng (navn) til en label...

Er det monstro ikke noget med at oprette labels inden i loopet, og så give dem name efter strengvariablen navn?
Avatar billede midas_dk Nybegynder
07. februar 2003 - 11:27 #8
Så blir det noget a là dette:

For i = 0 To 5
    Dim navn As String = "lblDate" & i
    Dim pos As Integer = (50 * i) + 80
    Dim lbl As New Label()

    lbl.Location = New System.Drawing.Point(120, pos)
    lbl.Name = navn
    lbl.Size = New System.Drawing.Size(48, 40)
    lbl.TabIndex = i
Next
Avatar billede burningice Nybegynder
07. februar 2003 - 11:31 #9
midas_dk>> hmm... skod... er der ikke en form for eval() funktion, ligesom i javascrit, hvor man kan oprette et variabelnavn ved at sætte to variabler sammen?! ...
problemet med din fremgangsmåde er at du kun opretter dine labels "lokalt" i din kodeblok... du SKAL oprette dem "globalt" i din klasse, og derefter refererer til dem inde i din For-løkke.
Avatar billede burningice Nybegynder
07. februar 2003 - 11:33 #10
midas_dk>> din metode kan forresten godt bruges i asp.net (med lidt modifikationer selvfølgelig)... du må ikke forveksle winforms med webforms, da teknikken er lidt anderledes...
Avatar billede burningice Nybegynder
07. februar 2003 - 11:37 #11
hehe.. well, det viser sig, at det kan man også... men... det er kun til c#, der er dog ingen der forbyder dig at oversætte til vb.net ;)

http://www.codeproject.com/csharp/livecodedotnet.asp
Avatar billede midas_dk Nybegynder
07. februar 2003 - 12:51 #12
Okay, jeg er vist lidt for ASP.NET mindet... I ASP.NET er der jo også en FindControl metode, som kan klare det for én.

Og jeg fatter nada af det link, du henviser til ;-) Men det må da kunne lade sig gøre på en eller anden vis!
Avatar billede midas_dk Nybegynder
07. februar 2003 - 12:58 #13
cyberfessor >> Kender du i øvrigt dette link? Det flipper ud lige med dette eksempel, men ellers er det en ret god ting :-)

http://www.aspalliance.com/aldotnet/examples/translate.aspx
Avatar billede burningice Nybegynder
07. februar 2003 - 15:12 #14
midas>> man skal lige vende sig til forskellen. Asp.net er jo ligesom et state-less miljø, hvor en side bliver executed, og det er så det. I Winforms bliver ens form jo ved med at være åben, og hvis man vil indsætte en label kan man ikke bare bruge Add(object) metoden, som man kan i asp.net, for... hvad komemr labelen til at hedde? man kan jo ikke have 5 labels der hedder det samme (som jo ville være tilfældet i dit eksempel ;)

nej, den kendte jeg ikke... har ikke haft brug for at konvertere den vej... det er mere fra vb.net til c#, og der klarer jeg mig for det meste med det jeg kan indenfor vb.net :)
Avatar billede hadaps Nybegynder
16. februar 2003 - 12:27 #15
Vil det så sige, at det kan ikke lade sig gøre i VB.NET?
Avatar billede burningice Nybegynder
16. februar 2003 - 12:47 #16
man skal aldrig sige aldrig... ;) uhm... hvad med evt at smide dine labels i en arraylist?

Dim lblDate1 As Label = new Label()
Dim lblDate2 As Label = new Label()
Dim lblDate3 As Label = new Label()
Dim lblDate4 As Label = new Label()
Dim lblDate5 As Label = new Label()
Dim arr As ArrayList
Dim i As Integer

arr.Add(lblDate1)
arr.Add(lblDate2)
arr.Add(lblDate3)
arr.Add(lblDate4)
arr.Add(lblDate5)

For i = 0 To 5
Dim pos As Integer = (50*i)+80

CType(arr(i), TextBox).Location = New System.Drawing.Point(120, pos)
CType(arr(i), TextBox).Size = New System.Drawing.Size(48, 40)
CType(arr(i), TextBox).Name = "lblDate"& i
CType(arr(i), TextBox).TabIndex = i

Next
Avatar billede hadaps Nybegynder
16. februar 2003 - 12:52 #17
nope - så gpr den død ved arr.add(lbldata1)
Avatar billede burningice Nybegynder
16. februar 2003 - 12:59 #18
der skulle da også stå lblDate1 ??
Avatar billede hadaps Nybegynder
16. februar 2003 - 13:01 #19
jaja.... det er mig som skrev forkert her :/

Jeg kopierede dit ind....
Avatar billede burningice Nybegynder
16. februar 2003 - 13:27 #20
uhm... ah, min fejl... kunne være du selv havde opdatet det..

Dim arr As ArrayList

skaæ være

Dim arr As ArrayList = new ArrayList()

man skal altid initialisere sine variabler før man bruger dem
Avatar billede hadaps Nybegynder
22. februar 2003 - 18:56 #21
ingen forskel :(

men tak for forsøget alle sammen....

hvis i smider nogle svar, vil jeg dele pointene mellem jer - i har jo trods alt gjort et stort forsøg ;)
Avatar billede burningice Nybegynder
22. februar 2003 - 22:16 #22
træls :(

jeg har dog en lille idet om hvad det kan være... prøv at skrive din kode så den står imellem Me.SuspendLayout() og this.ResumeLayout()
Avatar billede burningice Nybegynder
22. februar 2003 - 22:17 #23
hvis det heller ikek virker, så er jeg helt lost
Avatar billede burningice Nybegynder
22. februar 2003 - 22:32 #24
hadaps>> så fik jeg det til at virke i et lille testprogram jeg har lavet...

du skal bruge den kode jeg har givet dig, men du skal lige rette lidt...

den her kode:
For i = 0 To 5
Dim pos As Integer = (50*i)+80

CType(arr(i), TextBox).Location = New System.Drawing.Point(120, pos)
CType(arr(i), TextBox).Size = New System.Drawing.Size(48, 40)
CType(arr(i), TextBox).Name = "lblDate"& i
CType(arr(i), TextBox).TabIndex = i

Next

skal være:

Me.SuspendLayout()
For i = 0 To 5
Dim pos As Integer = (50*i)+80
Dim tmp As TextBox = CType(arr(i), TextBox)

tmp.Location = New System.Drawing.Point(120, pos)
tmp.Size = New System.Drawing.Size(48, 40)
tmp.Name = "lblDate"& i
tmp.TabIndex = i

Me.Controls.Add(tmp)
Next
Me.ResumeLayout(false)
Avatar billede hadaps Nybegynder
22. februar 2003 - 22:40 #25
kan du komme med hele kodensamlet?

for jeg kan ikke få det til at virke :(
Avatar billede burningice Nybegynder
22. februar 2003 - 22:46 #26
du kan faktisk også godt bruge denne kode

            this.SuspendLayout();
            for (int i = 0; i < 10; i++)
            {
                int pos = 50 + i*80;
                Label l = new Label();
                l.Location = new System.Drawing.Point(pos, 20);
                l.Size = new System.Drawing.Size(100, 100);
                l.Name = "lbl"+i.ToString();
                l.Text = "heeeeeeeeej";

                this.Controls.Add(l);
            }
           
            this.ResumeLayout(false);

men så vil du have problemer med at fange teksten i din tekstbox senere, da du ikke rigtig vil have nogen reference til den... det kan dog klares ved at loope igennem alle dine kontroller til du finder den rigtige.. f.eks. sådan her

            foreach(Control c in this.Controls)
            {
                if (c.GetType() == typeof(Label))
                {
                    if (((Label)c).Name == "lbl1")
                    {
                        MessageBox.Show(((Label)c).Text);
                    }
                }
            }
Avatar billede z42cool Nybegynder
26. februar 2003 - 22:43 #27
Hvorfor laver du ikke et array? Jeg kan kun lige klare det i c#, men midas.dk oversætter sikkert gerne :-)

Label[] dynLabels = new Label[5];
Label label;

for (i=0; i<5; i++)
{
  label = new Label();
  label.Location = new System.Drawing.Point(50+i*80);
  label.Size = new System.Drawing.Size(100, 100);
  label.Name = "lbl" + i.ToString();
  label.Text = "Label " + i.ToString();
  dynLabel[i] = label;
  Controls.Add(label);
}

Så kan du senere få fat på dine labels ved at:

dynLabels[2].Text = "A new value";
Avatar billede burningice Nybegynder
26. februar 2003 - 23:05 #28
z42cool>> det var også hvad jeg fik skrevet i min sidste kommentar
Avatar billede z42cool Nybegynder
26. februar 2003 - 23:11 #29
cyberfessor>> Nej! Du tilføjer dem blot til ControlCollection'en og derved kræver du en søgning hver gang du skal tilgå en dynamisk label. Ved at gemme dem i et arrayet spares denne søgning med tidskomplektsitet O(n).
Avatar billede burningice Nybegynder
26. februar 2003 - 23:23 #30
ja, okay.. det er selvfølgelig rigtig nok... det overså jeg... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester