Bu Kod Neden Çalışıyor C#
-
Ciddi soruyorum bu kod neden çalışıyor, kendim yazdım ama sonradan kafam karıştı.
Sorum şu, comboboxtan gelen sayıyı aldıktan sonra o sayı kadar for döngüsü çalışıyor.
Döngü her döndüğünde bir tane text box açılmasını istiyorum. Bunun için Textbox sınıfından txt diye bir nesne yaptım.
Sonra bu txt ' nin name alanına döngü döndükçe farklı isimler verdim.
Analamadığım nokta:
Döngü her döndüğünde hep aynı isimli yani txt adlı nesne yaratılıyor.
Bu txt nin name alanına txt1 - txt2 diye isim veriliyor.
Her text alanı, bağımsız birer txt1 - txt2 isimleriyle kullanılabiliyor.
Bu nasıl oluyor ?
Döngü her döndüğünde hepp txt diye nesne yaratıp duruyor. Bunların isimleri farklı olması gerekmez mi ?
Sonuçta aynı adlı nesneye alan verip duruyorsun new TextBox(); diyerek.
Doğru çalışıyor ama anlamadım olayı...
private void ekleButon_Click(object sender, EventArgs e) { int adet = Convert.ToInt32(cmbAdet.SelectedItem); for (int i = 0; i < adet; i++) { TextBox txt = new TextBox(); txt.Location = new Point(130, (i + 1) * 60); txt.Name = "txt" + i.ToString(); this.Controls.Add(txt);
-
break point koyarak i değerine bi bak hocam.. isimlerinin (name) txt olduğunu nasıl biliyorsun ?
-
unbalanced bunu yazdı
break point koyarak i değerine bi bak hocam.. isimlerinin (name) txt olduğunu nasıl biliyorsun ?
Baktım şimdi eğer seni doğru anladıysam,
txt0 txt1 ... diye değer alıyor.
Kafamı karıştıran nokta,
her döngüde yeni bir nesneyi aynı isimle yapmak bana saçma geliyor.
Acaba aynı adlı olsa bile her new çağrısı ile aynı isimli nesneye farklı alanlar mı tahsis ediliyor ?
Var mı böyle bir şey...
-
zeybekustasi bunu yazdıunbalanced bunu yazdı
break point koyarak i değerine bi bak hocam.. isimlerinin (name) txt olduğunu nasıl biliyorsun ?
Baktım şimdi eğer seni doğru anladıysam,
txt0 txt1 ... diye değer alıyor.
Kafamı karıştıran nokta,
her döngüde yeni bir nesneyi aynı isimle yapmak bana saçma geliyor.
Acaba aynı adlı olsa bile her new çağrısı ile aynı isimli nesneye farklı alanlar mı tahsis ediliyor ?
Var mı böyle bir şey...
soyle yaparsan
foreach (Control x in this.Controls) { if (x is TextBox) { MessageBox.Show(((TextBox)x).Name); MessageBox.Show(((TextBox)x).Text); } }
hepsinin ismi txt oldugunu gorurursun
sen burda object yaratigin ismi ayni olmasi onemli degil , zeybekustasi diye bi class yarat sonra ona isim ve lokasyon diye bi property ver ondan sonra kontroler diye baska bi class yarat onun icinde zeytinburnu klasindan objekleri alan ve bi arraya atayan bi funksion yazsan istedigin kadar zeybekustasi objesi yaratip o funksiona atabilirsin sonra o diger objekeki o arrayi okudugunda tum objektlerin isim ve lokasyon property sine ulasabilirsin objektlerin isimleri ayni olmasi onemli degil cunku tum objeler arrayin icinde, anlatma yetenegim baya zayif umarim yarim yamalakta olsa bi seyler anlayabilirsin.
geniuss tarafından 05/Eyl/14 14:51 tarihinde düzenlenmiştir -
hocam aynı isimden kastın nedir anlamadım :)
new ile yarattığın nesneler bellekte ayrı bir yer işgal ederler. bunların birbiriyle bağlantısı yok. eğer kast ettiğin text özelliği ise onun aynı olmasında sorun yok. Ama kast ettiğin name ise, aynı isimle zaten olamaz formda. senin kodunda da txt0, txt1... diye oluşturuyor. yani ortada bir problem görünmüyor..
----
üstteki arkadaşın yazdığından anladım soruyu. senin kast ettiğin değişkenin adı. yani sen
TextBox txt
burada txt ismine takılmışsın. Bu sadece nesnenin ismi ve bir önemi yok. Ancak döngü bittikten sonra bu nesneye bir daha erişemezsin, ve yeni txt nesnesi oluşturduğunda bu da belleğin farklı bi alanına adreslenir
unbalanced tarafından 05/Eyl/14 14:50 tarihinde düzenlenmiştir -
unbalanced bunu yazdı
hocam aynı isimden kastın nedir anlamadım :)
new ile yarattığın nesneler bellekte ayrı bir yer işgal ederler. bunların birbiriyle bağlantısı yok. eğer kast ettiğin text özelliği ise onun aynı olmasında sorun yok. Ama kast ettiğin name ise, aynı isimle zaten olamaz formda. senin kodunda da txt0, txt1... diye oluşturuyor. yani ortada bir problem görünmüyor..
foreach (Control x in this.Controls)
{
if (x is TextBox)
{
MessageBox.Show(((TextBox)x).Name);
MessageBox.Show(((TextBox)x).Text);
}
}
sunu deneyebilirsin hepsinin isminin txt oldugunu goruceksin txt0,txt1 degil. onemli olan control bi array ve bunun icinde olmasi
-
unbalanced bunu yazdı
hocam aynı isimden kastın nedir anlamadım :)
new ile yarattığın nesneler bellekte ayrı bir yer işgal ederler. bunların birbiriyle bağlantısı yok. eğer kast ettiğin text özelliği ise onun aynı olmasında sorun yok. Ama kast ettiğin name ise, aynı isimle zaten olamaz formda. senin kodunda da txt0, txt1... diye oluşturuyor. yani ortada bir problem görünmüyor..
----
üstteki arkadaşın yazdığından anladım soruyu. senin kast ettiğin değişkenin adı. yani sen
TextBox txt
burada txt ismine takılmışsın. Bu sadece nesnenin ismi ve bir önemi yok. Ancak döngü bittikten sonra bu nesneye bir daha erişemezsin, ve yeni txt nesnesi oluşturduğunda bu da belleğin farklı bi alanına adreslenir
(:
Benim bildiğim -yanlışsan düzeltin- text in name alanı onun nesne adı oluyor. Yani sürükle bırakla yapınca sağ panelde name kısmında yazan şey textbox1 onun nesne adı oluyor diye biliyorum.
Bence hatam burada.
Yani, name alanı bir textbox için TextBox sınıfının nesne adı anlamına geliyor mu gelmiyor mu 1. sorum bu ?
-
işler karıştı hocam anlamadım demek istedğini. özel mesajına cvp verdim, yeterli değilse teamviewer ver adım adım anlatayım neyse sorun. ben de tam anlamadım ne demek istediğini.
-
geniuss bunu yazdızeybekustasi bunu yazdıunbalanced bunu yazdı
break point koyarak i değerine bi bak hocam.. isimlerinin (name) txt olduğunu nasıl biliyorsun ?
Baktım şimdi eğer seni doğru anladıysam,
txt0 txt1 ... diye değer alıyor.
Kafamı karıştıran nokta,
her döngüde yeni bir nesneyi aynı isimle yapmak bana saçma geliyor.
Acaba aynı adlı olsa bile her new çağrısı ile aynı isimli nesneye farklı alanlar mı tahsis ediliyor ?
Var mı böyle bir şey...
soyle yaparsan
foreach (Control x in this.Controls) { if (x is TextBox) { MessageBox.Show(((TextBox)x).Name); MessageBox.Show(((TextBox)x).Text); } }
hepsinin ismi txt oldugunu gorurursun
sen burda object yaratigin ismi ayni olmasi onemli degil , zeybekustasi diye bi class yarat sonra ona isim ve lokasyon diye bi property ver ondan sonra kontroler diye baska bi class yarat onun icinde zeytinburnu klasindan objekleri alan ve bi arraya atayan bi funksion yazsan istedigin kadar zeybekustasi objesi yaratip o funksiona atabilirsin sonra o diger objekeki o arrayi okudugunda tum objektlerin isim ve lokasyon property sine ulasabilirsin objektlerin isimleri ayni olmasi onemli degil cunku tum objeler arrayin icinde, anlatma yetenegim baya zayif umarim yarim yamalakta olsa bi seyler anlayabilirsin.
Anlaşılmıştır çok teşekkür ederim :)
-
zeybekustasi bunu yazdıunbalanced bunu yazdı
break point koyarak i değerine bi bak hocam.. isimlerinin (name) txt olduğunu nasıl biliyorsun ?
Baktım şimdi eğer seni doğru anladıysam,
txt0 txt1 ... diye değer alıyor.
Kafamı karıştıran nokta,
her döngüde yeni bir nesneyi aynı isimle yapmak bana saçma geliyor.
Acaba aynı adlı olsa bile her new çağrısı ile aynı isimli nesneye farklı alanlar mı tahsis ediliyor ?
Var mı böyle bir şey...
Aynı isimle oluşturmuyorsun ki. Sadece oluşturduğun nesnelerin referansını aynı değişkene aktarıp işliyorsun. "TextBox txt"
txt değişkenine her oluşturduğun nesnenin referansını eşitliyorsun ki txt değişkeni ile işlem yapabilirsin.
Istersen her biri için ayrı değişkende oluşturabilirsin ki. List ile bunu yapabilirsin.
-
unbalanced yakşalık 40 dakkadır bir sürü soruyu team den yanıtları :)
buradan teşekkürlerimi iletiyorum :))