PDA

View Full Version : نحوه ی ایجاد کنترل x از روی کنترل موجود y با خواص کنترل موجود y



RAMA2009
شنبه 21 آذر 1394, 16:00 عصر
:) سلام چطولین
میدونم که مثال ها و نمونه کدهای فراوانی برای ایجاد کنترل در زمان اجرا هست. از اون لحاظ مشکلی نیست، اوکی؟
اصل سوال اینه که چطور میتونیم از روی کنترلی که روی فرم وجود داره یه کنترل جدید در زمان اجرا بسازیم با همون خواص کنترل موجود که روی فرم هستش.
مثلا یه کامند داریم با رنگ و فونت و خواص مختص به خود، حالا یه کامند میخوایم در زمان اجرا بسازیم با همین خواص کامند موجود(بدون مقدار دهی دوباره به خواص کامند جدید).
یک نمونه ارائه بدید لطفا ممنون.

RAMA2009
شنبه 21 آذر 1394, 17:39 عصر
سوال دومم هم در رابطه با همین ایجاد آبجکت در زمان اجراست واسه همین همینجا مطرحش میکنم:
ببینم از پس این سوال کی برمیاد:

سورس زیر رو ببینید:


Public Class Form1
Public pointX As Integer
Public pointY As Integer = 32
Public dynamicText As TextBox
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
pointX = 330
For i = 1 To 4

dynamicText = New Windows.Forms.TextBox
dynamicText.Name = "T" + Str(i)
dynamicText.Text = ""
dynamicText.Location = New Point(pointX, pointY)
dynamicText.Size = New Size(100, 20)
Me.Controls.Add(dynamicText)
pointX = pointX - 106
Next

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
pointX = 330
pointY = pointY + 26
For i = 1 To 4
dynamicText = New Windows.Forms.TextBox
dynamicText.Name = "T" + Trim(Str(i))
dynamicText.Text = ""
dynamicText.Location = New Point(pointX, pointY)
dynamicText.Size = New Size(100, 20)
Me.Controls.Add(dynamicText)
pointX = pointX - 106
Next
AddHandler dynamicText.Click, AddressOf printHello1

End Sub

Private Sub printHello1(ByVal sender As System.Object, ByVal e As System.EventArgs)
MsgBox(dynamicText.Name)
If dynamicText.Name = "T1" Then MsgBox("Oh! this is T1")
End Sub
End Class



نکته اول) همونطور که توی سورس میبینید داخل فرم لود چهار آبجکت textBox با نامهای T1 تا T4 ایجاد کردم.
و بعد داخل رویداد کلیک آبجکت باتون هم به همین شکل چهار آبجکت textBox با نامهای T1 تا T4 ایجاد کردم!!!
یعنی با فراخوانی یکبار رویداد کلیک باتون، چهار آبجکت textBox دو به دو هم نام داریم! چرا؟! مگه همچین چیزی توی برنامه نویسی امکان داره؟! دات نت به چه روشی این آبجکت ها رو از هم تشخیص میده؟! چطور میتونم مقدار خاصیت name آبجکت ایجاد شده در زمان اجرا رو برگردونم؟
یادمه توی vb6 خیلی راحت با آرایه ها سروکار داشتیم و هر آبجکت ایجاد شده با شماره آرایه مختص خودش شناسایی میشد.

نکته دوم) این مهمه که هر آبجکتی که ایجاد میشه name و رویدادهای مختص خودش رو داشته باشه و بتونیم توی رویداد مختص خودش کد مورد نظرمون رو بنویسیم.
اما همونطور که مبینید من موفق به این کار نشدم و جالب اینکه کد
MsgBox(dynamicText.Name) فقط مقدار T4 را برمیگرداند! چرا؟!

لطفا اطلاعاتتون رو به اشتراک بذارید. ممنون.

RAMA2009
شنبه 21 آذر 1394, 17:41 عصر
سوال دومم هم در رابطه با همین ایجاد آبجکت در زمان اجراست واسه همین همینجا مطرحش میکنم:
ببینم از پس این سوال کی برمیاد:

سورس زیر رو ببینید:


Public Class Form1
Public pointX As Integer
Public pointY As Integer = 32
Public dynamicText As TextBox
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
pointX = 330
For i = 1 To 4

dynamicText = New Windows.Forms.TextBox
dynamicText.Name = "T" + Trim(Str(i))
dynamicText.Text = ""
dynamicText.Location = New Point(pointX, pointY)
dynamicText.Size = New Size(100, 20)
Me.Controls.Add(dynamicText)
pointX = pointX - 106
Next

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
pointX = 330
pointY = pointY + 26
For i = 1 To 4
dynamicText = New Windows.Forms.TextBox
dynamicText.Name = "T" + Trim(Str(i))
dynamicText.Text = ""
dynamicText.Location = New Point(pointX, pointY)
dynamicText.Size = New Size(100, 20)
Me.Controls.Add(dynamicText)
pointX = pointX - 106
Next
AddHandler dynamicText.Click, AddressOf printHello1

End Sub

Private Sub printHello1(ByVal sender As System.Object, ByVal e As System.EventArgs)
MsgBox(dynamicText.Name)
If dynamicText.Name = "T1" Then MsgBox("Oh! this is T1")
End Sub
End Class



نکته اول) همونطور که توی سورس میبینید داخل فرم لود چهار آبجکت textBox با نامهای T1 تا T4 ایجاد کردم.
و بعد داخل رویداد کلیک آبجکت باتون هم به همین شکل چهار آبجکت textBox با نامهای T1 تا T4 ایجاد کردم!!!
یعنی با فراخوانی یکبار رویداد کلیک باتون، چهار آبجکت textBox دو به دو هم نام داریم! چرا؟! مگه همچین چیزی توی برنامه نویسی امکان داره؟! دات نت به چه روشی این آبجکت ها رو از هم تشخیص میده؟! چطور میتونم مقدار خاصیت name آبجکت ایجاد شده در زمان اجرا رو برگردونم؟
یادمه توی vb6 خیلی راحت با آرایه ها سروکار داشتیم و هر آبجکت ایجاد شده با شماره آرایه مختص خودش شناسایی میشد.

نکته دوم) این مهمه که هر آبجکتی که ایجاد میشه name و رویدادهای مختص خودش رو داشته باشه و بتونیم توی رویداد مختص خودش کد مورد نظرمون رو بنویسیم.
اما همونطور که مبینید من موفق به این کار نشدم و جالب اینکه کد
MsgBox(dynamicText.Name) در هربار کلیک روی هر آبجکت textBox فقط مقدار T4 را برمیگرداند! چرا؟!

لطفا اطلاعاتتون رو به اشتراک بذارید. ممنون.

amir20611
یک شنبه 22 آذر 1394, 18:48 عصر
سلام ، میتونید تکست باکس ها را در یک لیست بریزید و از این طریق به اون ها دسترسی داشته باشید


Dim ListTextbox As New List(Of TextBox)()
Private Sub frm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
pointX = 330
For i = 1 To 4


dynamicText = New Windows.Forms.TextBox
dynamicText.Name = "T" + Trim(Str(i))
dynamicText.Text = ""
dynamicText.Location = New Point(pointX, pointY)
dynamicText.Size = New Size(100, 20)
Me.Controls.Add(dynamicText)
pointX = pointX - 106
ListTextbox.Add(dynamicText)
Next
End Sub
Private Sub btn_Save_Click(sender As Object, e As EventArgs) Handles btn_Save.Click
For Each txt As TextBox In ListTextbox.ToArray
If txt.Name = "T1" Then
MsgBox("Oh! this is T1")
End If
Next
End Sub