PDA

View Full Version : سوال: لیست نام component های فرم ایجاد شده runtime



roya_hh
سه شنبه 29 بهمن 1387, 10:11 صبح
چگونه می توان اسم تمامی کامپوننتهای روی فرمی که runtime ایجاد شده است و بر روی آن کامپوننت قرار داده شده است را بدست آورد؟

anooshiran
سه شنبه 29 بهمن 1387, 10:28 صبح
دوست عزيز سلام

با كد زير




Dim ControlArray(Me.Controls.Count - 1) As String
Dim i As Int16 = 0
For Each ctr As Object In Me.Controls
ControlArray(i) = ctr.Name
i += 1
Next

ميتواني نام كنترل هاي روي فرم را پيدا كرده و در يك آرايه بريزي

اميدوارم مشكلت را حل كند

roya_hh
سه شنبه 29 بهمن 1387, 10:47 صبح
جواب نمیده. یعنی اسم کامپوننت ها را بر نمی گرداند. و همه کامپوننتها را هم به لیست اضافه نمی کند. فقط 3-4 تارا به این array اضافه میکنه ( در صورتیکه من 3تا textbox و 3تا panel و 3تا lable و 5تا button بر روی فرم دارم)

anooshiran
سه شنبه 29 بهمن 1387, 10:52 صبح
جواب نمیده. یعنی هیچ کدوم از component ها را روی فرم نمیشناسه
مقدار a.Controls.Count را صفر بر میگرداند. (a فرمی است که run time ایجاد شده و دارای 3 تا component است)
در چه event اين كد را استفاده كردي؟
اگر در Load باشه كه هنوز كنترل add نشده.
روي فرمت براي امتحان يك button هم بگذار و بعد از لود شدن از button_Click استفاده كن.

در هر صورت اين كد جواب ميده. مهم اين است كه وقتي كنترل ها add شدن اين كد به روال بيفته.
باز هم اگر مشكلي بود بگو

roya_hh
سه شنبه 29 بهمن 1387, 11:05 صبح
ممنون از لطف شما. بقیه component ها که اضافه نمی شد به این خاطر بود که در panel ها add شده بودند نه در فرم.

roya_hh
سه شنبه 29 بهمن 1387, 16:12 عصر
مقادیر این کامپوننت ها را چطور بدست بیارم؟
من یک event handler نوشته ام برای عملیات insert، تا این مرحله مشکلی ندارم و با استفاده از همان array بالا این کار را انجام می دهم:
)insert into table1 (id,field1,field2,field3) values
اما حالاکه می خواهم مقادیر را وارد کنم دچار مشکل شدم و نمی دونم چطور این مقادیر را بدست بیاورم.

anooshiran
سه شنبه 29 بهمن 1387, 16:31 عصر
مقادیر این کامپوننت ها را چطور بدست بیارم؟
من یک event handler نوشته ام برای عملیات insert، تا این مرحله مشکلی ندارم و با استفاده از همان array بالا این کار را انجام می دهم:
)insert into table1 (id,field1,field2,field3) values
اما حالاکه می خواهم مقادیر را وارد کنم دچار مشکل شدم و نمی دونم چطور این مقادیر را بدست بیاورم.


دوست عزيز

من سئوال شما را درست متوجه نشدم

آيا در Insert كردن مشكل داري؟ اگر اينطوره كد insert را برام بنويس

در ثاني منظور شما از Tag و SumMenu چيه؟ اين رو هم درست متوجه نميشم . اگر امكان دارد از لغات رايج خود ‍control استفاده كن تا متوجه بشم.
در هر صورت اميدوارم بتتوانم كمكي كنم.

roya_hh
چهارشنبه 30 بهمن 1387, 08:02 صبح
فرمی که run time ایجاد کردم دارای تعدادی کامپوننت (textbox , button) است که بر مبنای آنها فیلد در یک جدول در دیتابیس دارم. حالا می خواهم در این کامپوننت ها مقادیر را وارد کرده و با زدن یک کلید این اطلاعات در در جدول وارد شود.
زمانی که button ایجاد می شود یک event handler به این صورت برایش نوشته ام:
AddHandler btn1.Click, AddressOf btninsertclick
حالا در Sub btninsertclick(ByVal sender As Object, ByVal e As EventArgs باید query inset را بنویسم.
تااین قسمت که اسم فیلد ها را قرار میدهد مشکلی ندارم ، اما برای مقادیر نمی دانم چطور به مقادیر کامپوننتهای روی فرم(مقادیر textbox) ها دست پیدا کنم:
(????????????????????)insert into table1 (id,field1,field2,field3) values

davoodrm666_666
چهارشنبه 30 بهمن 1387, 09:01 صبح
اگه منظورت پیداکردن کنترل ها روی فرم باشه کد زیر کارتو راه می ندازه


Dim ctl as Object = Me.GetNextControl(Me,True)
Do Until ctl Is Nothing
If TypeOf (ctl) Is Button Then
DataGridView1.Rows.add(Ctl.Name)
End If
ctl = Me.GetNextControl(ctl, True)
Loop

البته شرط TypeOf رو باید بر داری

anooshiran
چهارشنبه 30 بهمن 1387, 10:39 صبح
فرمی که run time ایجاد کردم دارای تعدادی کامپوننت (textbox , button) است که بر مبنای آنها فیلد در یک جدول در دیتابیس دارم. حالا می خواهم در این کامپوننت ها مقادیر را وارد کرده و با زدن یک کلید این اطلاعات در در جدول وارد شود.
زمانی که button ایجاد می شود یک event handler به این صورت برایش نوشته ام:
AddHandler btn1.Click, AddressOf btninsertclick
حالا در Sub btninsertclick(ByVal sender As Object, ByVal e As EventArgs باید query inset را بنویسم.
تااین قسمت که اسم فیلد ها را قرار میدهد مشکلی ندارم ، اما برای مقادیر نمی دانم چطور به مقادیر کامپوننتهای روی فرم(مقادیر textbox) ها دست پیدا کنم:
(????????????????????)insert into table1 (id,field1,field2,field3) values


سلام دوست عزيز

شما مي توانيد از AddWithValue براي اضافه كردن مقادير استفاده كنيد.



sqlCon.Open()
sqlCom.CommandText = "INSERT INTO TableName (id,field1,field2,field3) VALUES (@id,@field1,@field2,@field3)"
With sqlCom.Parameters
.Clear()
.AddWithValue("@id", id)
.AddWithValue("@field1", txt1.Text)
.AddWithValue("@field2", txt2.Text)
.AddWithValue("@field3", txt3.Text)
End With
sqlCom.ExecuteNonQuery()
sqlCon.Close()



شما در query هر فيلد را معادل نام همان فيلد قزار داده ولي دركنار نام در قسمت value علامت @ را اضافه كنيد .بعد همانطور كه در كد مي بينيد از طريق AddWithValue مقادير كنترل هاي خود را به فيلد بدهيد.
اميدوارم مشكل شما را حل كند

naeeme
چهارشنبه 30 بهمن 1387, 11:01 صبح
اگر این کد رو در رویداد کلیک دکمه قرار بدین، می تونین به مقادیر دسترسی پیدا کنین. البته من فقط کنترل های تکست باکس رو از توی فرم جدا کردم.


Dim frm As Windows.Forms.Control = CType(sender, Button).Parent
Dim ctl As Control = frm.GetNextControl(frm, True)
Dim AryLstControl As New ArrayList

Do Until ctl Is Nothing
If TypeOf (ctl) Is TextBox Then
AryLstControl.Add(ctl)
End If
ctl = frm.GetNextControl(ctl, True)
Loop

For Each item As TextBox In AryLstControl
Select Case item.Name
Case "txtField"
strFieldValue = item.Text
Case "txtName"
strNameValue = item.Text
Case "txtId"
strIdValue = item.Text
End Select
Next

حامد مصافی
چهارشنبه 30 بهمن 1387, 11:32 صبح
تمام کنترل های نمایش داده شده در فرم الزاماً عضوی از Me.Controls نیستند. آنها ممکن است عضو لیستی مانند Me.Panel1.Controls باشند. لذا شما به منظور کسب نام تمامی کنترل ها کد پست شماره 9 را به ازای تمام کنترل های یافت شده مجدداً باید انجام دهید.

مثال:


Public Class Form1

Dim CtrlsList As New List(Of Control)
'
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
GetControlOf(Me)
End Sub
Private Sub GetControlOf(ByVal Ctrl As Control)
For Each c As Control In Ctrl.Controls
CtrlsList.Add(c)
GetControlOf(c)
Next
End Sub
End Class

roya_hh
چهارشنبه 30 بهمن 1387, 12:06 عصر
اگر این کد رو در رویداد کلیک دکمه قرار بدین، می تونین به مقادیر دسترسی پیدا کنین. البته من فقط کنترل های تکست باکس رو از توی فرم جدا کردم.


Dim frm As Windows.Forms.Control = CType(sender, Button).Parent
Dim ctl As Control = frm.GetNextControl(frm, True)
Dim AryLstControl As New ArrayList

Do Until ctl Is Nothing
If TypeOf (ctl) Is TextBox Then
AryLstControl.Add(ctl)
End If
ctl = Me.GetNextControl(ctl, True)
Loop

For Each item As TextBox In AryLstControl
Select Case item.Name
Case "txtField"
strFieldValue = item.Text
Case "txtName"
strNameValue = item.Text
Case "txtId"
strIdValue = item.Text
End Select
Next


ممکنه کمی درباره کدی که قرار دادید توضیح بدهید؟ اگر کنترلها(textbox) داخل panel قرار داشته باشند چکار کنم؟

naeeme
چهارشنبه 30 بهمن 1387, 12:32 عصر
اگر شما 50 تا panel متداخل هم داشته باشی، این کد تمام کنترلهای داخل اونها رو بر می گردونه. دلیلش هم این هست که در کدی که دوستمون davoodrm666_666 نوشتن و من برای کار شما مناسبش کردم، در حلقه Do تمام کنترلها جستجو میشن.
فقط به این نکته توجه کنین که ctl = Me.GetNextControl(ctl, True)
باید به ctl = frm.GetNextControl(ctl, True)
تبدیل بشه. فکر کنم این کد کارتون رو راه میندازه.

roya_hh
چهارشنبه 30 بهمن 1387, 12:46 عصر
اگر شما 50 تا panel متداخل هم داشته باشی، این کد تمام کنترلهای داخل اونها رو بر می گردونه. دلیلش هم این هست که در کدی که دوستمون davoodrm666_666 نوشتن و من برای کار شما مناسبش کردم، در حلقه Do تمام کنترلها جستجو میشن.
فقط به این نکته توجه کنین که ctl = Me.GetNextControl(ctl, True)
باید به ctl = frm.GetNextControl(ctl, True)
تبدیل بشه. فکر کنم این کد کارتون رو راه میندازه.

ببخشید این کد فقط panel که button توی اون قرار داره را میگرده ولی بقیه panel ها را نمیگرده که مقادیر کنترلها را برگرداند. اگر در panel که button ها قرار دارد یک textbox قرار دهیم مقدار آنرا بر میگرداند اما به بقیه panel ها اصلا وارد نمی شود؟

davoodrm666_666
چهارشنبه 30 بهمن 1387, 13:07 عصر
ببخشید این کد فقط panel که button توی اون قرار داره را میگرده ولی بقیه panel ها را نمیگرده که مقادیر کنترلها را برگرداند. اگر در panel که button ها قرار دارد یک textbox قرار دهیم مقدار آنرا بر میگرداند اما به بقیه panel ها اصلا وارد نمی شود؟
همونطور که گفتم شما باید شرط TypeOf رو تغییر بدید برای TextBox بنویسید TypeOf(TextBox)

roya_hh
چهارشنبه 30 بهمن 1387, 13:48 عصر
همونطور که گفتم شما باید شرط TypeOf رو تغییر بدید برای TextBox بنویسید TypeOf(TextBox)

من از کدی که دستمون naeeme گذاشته بودند استفاده کردم. اگه ممکنه بگید کجای این کرد باید تغییر کنه:




Dim frm As Windows.Forms.Control = CType(sender, Button).Parent
Dim ctl As Control = frm.GetNextControl(frm, True)
Dim AryLstControl As New ArrayList

Do Until ctl Is Nothing
If TypeOf (ctl) Is TextBox Then
AryLstControl.Add(ctl)
End If
ctl = frm.GetNextControl(ctl, True)
Loop

For Each item As TextBox In AryLstControl
Select Case item.Name
Case "txtfield22"
MsgBox(item.Text)
End Select
Next

anooshiran
چهارشنبه 30 بهمن 1387, 16:35 عصر
سلام دوست عزيز

يك نگاهي به اين پروژه كوچك كه بازسازي تقريبي برنامه شماست بنداز

فكر مي كنم مشكلت حل بشه