چگونه می توان اسم تمامی کامپوننتهای روی فرمی که runtime ایجاد شده است و بر روی آن کامپوننت قرار داده شده است را بدست آورد؟
چگونه می توان اسم تمامی کامپوننتهای روی فرمی که runtime ایجاد شده است و بر روی آن کامپوننت قرار داده شده است را بدست آورد؟
دوست عزيز سلام
با كد زير
Dim ControlArray(Me.Controls.Count - 1) AsString
Dim i As Int16 = 0
ForEach ctr AsObjectInMe.Controls
ControlArray(i) = ctr.Name
i += 1
Next
ميتواني نام كنترل هاي روي فرم را پيدا كرده و در يك آرايه بريزي
اميدوارم مشكلت را حل كند
جواب نمیده. یعنی اسم کامپوننت ها را بر نمی گرداند. و همه کامپوننتها را هم به لیست اضافه نمی کند. فقط 3-4 تارا به این array اضافه میکنه ( در صورتیکه من 3تا textbox و 3تا panel و 3تا lable و 5تا button بر روی فرم دارم)
آخرین ویرایش به وسیله roya_hh : سه شنبه 29 بهمن 1387 در 09:57 صبح
ممنون از لطف شما. بقیه component ها که اضافه نمی شد به این خاطر بود که در panel ها add شده بودند نه در فرم.
مقادیر این کامپوننت ها را چطور بدست بیارم؟
من یک event handler نوشته ام برای عملیات insert، تا این مرحله مشکلی ندارم و با استفاده از همان array بالا این کار را انجام می دهم:
)insert into table1 (id,field1,field2,field3) values
اما حالاکه می خواهم مقادیر را وارد کنم دچار مشکل شدم و نمی دونم چطور این مقادیر را بدست بیاورم.
دوست عزيز
من سئوال شما را درست متوجه نشدم
آيا در Insert كردن مشكل داري؟ اگر اينطوره كد insert را برام بنويس
در ثاني منظور شما از Tag و SumMenu چيه؟ اين رو هم درست متوجه نميشم . اگر امكان دارد از لغات رايج خود control استفاده كن تا متوجه بشم.
در هر صورت اميدوارم بتتوانم كمكي كنم.
فرمی که 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
اگه منظورت پیداکردن کنترل ها روی فرم باشه کد زیر کارتو راه می ندازه
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 رو باید بر داری
سلام دوست عزيز
شما مي توانيد از 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)
EndWith
sqlCom.ExecuteNonQuery()
sqlCon.Close()
شما در query هر فيلد را معادل نام همان فيلد قزار داده ولي دركنار نام در قسمت value علامت @ را اضافه كنيد .بعد همانطور كه در كد مي بينيد از طريق AddWithValue مقادير كنترل هاي خود را به فيلد بدهيد.
اميدوارم مشكل شما را حل كند
اگر این کد رو در رویداد کلیک دکمه قرار بدین، می تونین به مقادیر دسترسی پیدا کنین. البته من فقط کنترل های تکست باکس رو از توی فرم جدا کردم.
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
آخرین ویرایش به وسیله naeeme : چهارشنبه 30 بهمن 1387 در 11:21 صبح
تمام کنترل های نمایش داده شده در فرم الزاماً عضوی از 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
اگر شما 50 تا panel متداخل هم داشته باشی، این کد تمام کنترلهای داخل اونها رو بر می گردونه. دلیلش هم این هست که در کدی که دوستمون davoodrm666_666 نوشتن و من برای کار شما مناسبش کردم، در حلقه Do تمام کنترلها جستجو میشن.
فقط به این نکته توجه کنین که ctl = Me.GetNextControl(ctl, True)
باید به ctl = frm.GetNextControl(ctl, True)
تبدیل بشه. فکر کنم این کد کارتون رو راه میندازه.
آخرین ویرایش به وسیله roya_hh : چهارشنبه 30 بهمن 1387 در 12:00 عصر
من از کدی که دستمون 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
سلام دوست عزيز
يك نگاهي به اين پروژه كوچك كه بازسازي تقريبي برنامه شماست بنداز
فكر مي كنم مشكلت حل بشه