ورود

View Full Version : تبدیل فرم به یک کنترل یا شیء فرزند و نمایش آن در یک Container Control مثل Panel



ROSTAM2
یک شنبه 26 تیر 1401, 17:19 عصر
به نام خدا
سلام؛
در اینجا می خوایم یک فرم رو تبدیل کنیم به Child Control و اون رو در یک Panel که یک Container Control هستش در یک فرم دیگر نمایش دهیم، و برای مثال یک خصوصیت داریم که مقدار اون رو در فرم والد یا Parent فراخوانی می کنیم:

این تصویر و کدهای فرمی هست که می خوایم شیء فرزند بشه:

153911


Public Class Form1
Private Expr As New Dictionary(Of String, String)


Public Property SelectedItem() As KeyValuePair(Of String, String)
Get
Return Me.ComboBox1.SelectedItem
End Get
Set(ByVal value As KeyValuePair(Of String, String))
Me.ComboBox1.SelectedItem = value
End Set
End Property


Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
With Expr
.Add("Item1", "Item1 Is selected.")
.Add("Item2", "Item2 Is selected.")
.Add("Item3", "Item3 Is selected.")
.Add("Item4", "Item4 Is selected.")
End With
With Me.ComboBox1.Items
.Clear()
For Each Item As KeyValuePair(Of String, String) In Expr
.Add(Item)
Next
End With
Me.ComboBox1.SelectedIndex = 0
End Sub
Private Sub ComboBox1_DrawItem(sender As System.Object, e As System.Windows.Forms.DrawItemEventArgs) Handles ComboBox1.DrawItem
Dim G As Graphics = e.Graphics
Dim V As String = CType(Me.ComboBox1.Items(e.Index), KeyValuePair(Of String, String)).Key
e.DrawBackground()
G.DrawString(V, e.Font, New SolidBrush(e.ForeColor), 2, e.Bounds.Y + 2)
End Sub


End Class


و این هم فرم اصلی و کد فراخوانی فرم اول در یک Panel:

153909


Public Class HelloWorld


Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
With Form1.SelectedItem
MsgBox(String.Format("Selected Item Key is {0} and Value is: {1}", .Key, .Value))
End With
End Sub


Private Sub HelloWorld_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
With Form1
.TopLevel = False
.WindowState = FormWindowState.Maximized
.FormBorderStyle = Windows.Forms.FormBorderStyle.None
.Visible = True
End With
Me.Panel1.Controls.Add(Form1)
End Sub
End Class



این هم حالت RunTime:

153910

prolog96
یک شنبه 26 تیر 1401, 19:07 عصر
سلام

از روشی که گفتین استفاده کردم . خوب بود و درست عمل کرد.

اما وقتی که کامبوهای خودم که در کدنویسی با اتصال بانک پر میشند . درست کار نمیکرد و اطلاعات کامبو را Null برگشت میداد.

کدها را عوض کردم و برای تکست باکس و چک باکس هم اجرا کردم و باز هم Null برگشت میداد . چک باکس را کلا False برگشت میده .

کدهای فرم دوم
Public Property strValSat() As Boolean
Get
Return Me.ChkBxSat.Checked
End Get
Set(ByVal value As Boolean)
Me.ChkBxSat.Checked = value
End Set
End Property
Public Property strValPri() As String
Get
Return Me.TxtBxSPri.Text
End Get
Set(ByVal value As String)
Me.TxtBxSPrii.Text = value
End Set
End Property
Public Property ValYet() As KeyValuePair(Of String, String)

Get

Return Me.CmbBxYet.SelectedValue

End Get

Set(ByVal value As KeyValuePair(Of String, String))

Me.CmbBxYet.SelectedValue = value

End Set

End Property

کذهای فرم اول
With Frm2.ValYet
MsgBox(String.Format("Selected Item Key is {0} and Value is: {1}", .Key, .Value))
End With


حتی تکست باکس و چک باکس هم مقدار درست را برگشت نداده.

ممنون میشم راهنمایی کنید

prolog96
یک شنبه 26 تیر 1401, 19:10 عصر
سلام

از روشی که گفتین استفاده کردم . خوب بود و درست عمل کرد.

اما وقتی که کامبوهای خودم که در کدنویسی با اتصال بانک پر میشند . درست کار نمیکرد و اطلاعات کامبو را Null برگشت میداد.

کدها را عوض کردم و برای تکست باکس و چک باکس هم اجرا کردم و باز هم Null برگشت میداد . چک باکس را کلا False برگشت میده .

کدهای فرم دوم
Public Property strValSat() As Boolean
Get
Return Me.ChkBxSat.Checked
End Get
Set(ByVal value As Boolean)
Me.ChkBxSat.Checked = value
End Set
End Property
Public Property strValPri() As String
Get
Return Me.TxtBxSPri.Text
End Get
Set(ByVal value As String)
Me.TxtBxSPrii.Text = value
End Set
End Property
Public Property ValYet() As KeyValuePair(Of String, String)
Get
Return Me.CmbBxYet.SelectedValue
End Get
Set(ByVal value As KeyValuePair(Of String, String))
Me.CmbBxYet.SelectedValue = value
End Set
End Property

کذهای فرم اول
With Frm2.ValYet
MsgBox(String.Format("Selected Item Key is {0} and Value is: {1}", .Key, .Value))
End With


حتی تکست باکس و چک باکس هم مقدار درست را برگشت نداده.

ممنون میشم راهنمایی کنید

ROSTAM2
یک شنبه 26 تیر 1401, 20:31 عصر
این خصوصیتهایی که مقادیر چک باکس و تکست باکس رو می گیرن:



Public Property Checked() As String
Get
Return Me.CheckBox1.Checked
End Get
Set(ByVal value As String)
Me.CheckBox1.Checked = value
End Set
End Property


Public Property Value() As String
Get
Return Me.TextBox1.Text
End Get
Set(ByVal value As String)
Me.TextBox1.Text = value
End Set
End Property


و این هم فراخوانی مقادیر:

153913

دوباره امتحان کن با فرمهای جدید.

ROSTAM2
یک شنبه 26 تیر 1401, 20:35 عصر
اما وقتی که کامبوهای خودم که در کدنویسی با اتصال بانک پر میشند . درست کار نمیکرد و اطلاعات کامبو را Null برگشت میداد.


اینکه اشیاء به بانک اطلاعاتی متصلن درست، مهم اینه که اشیاء مقدار رو بگیرن که بتونن مقدار برگردونن.

prolog96
دوشنبه 27 تیر 1401, 11:59 صبح
سلام
ممنون آقای رستمی
عالی بود . مشکل برگردوندن مقدارها حل شد. مرسی

چند روز هست مزاحم شما میشم . ببحشید حلال کنید
یه سوال دیگه هم دارم.

وقتی که فرم دوم را به فرم اول وصل میکنیم . میگیم فوکوس کن به تکست فاکس فلان در فرم دوم . اما هیچ اتفاقی نمیوفته.
حتی در لود فرم دوم هم ، فوکوس را میگذارم ، اما فوکوس نمیکنه .

With FrmDev
.TopLevel = False
.WindowState = FormWindowState.Maximized
.FormBorderStyle = Windows.Forms.FormBorderStyle.None
.Visible = True
End With
PnlDev1.Controls.Clear()
PnlDev1.Controls.Add(FrmDev)
PnlDev1.Visible = True
FrmDev.TxtBxSPri.Focus()

حتی فوکوس را آوردن داخل حلقه With باز هم اتفاقی نیوفتاد .
زحمت میکشید راهنمایی کنید.
ممنون

ROSTAM2
دوشنبه 27 تیر 1401, 12:25 عصر
وقتی که فرم دوم را به فرم اول وصل میکنیم . میگیم فوکوس کن به تکست فاکس فلان در فرم دوم . اما هیچ اتفاقی نمیوفته.
حتی در لود فرم دوم هم ، فوکوس را میگذارم ، اما فوکوس نمیکنه .


سلام.
از رویداد Shown از خود فرم استفاده کن:

Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
Me.TextBox1.Focus()
End Sub

prolog96
پنج شنبه 30 تیر 1401, 15:00 عصر
سلام آقای رستمی
سوال اول
با روش شما فرمها را در فرم اصلی لود کردم . حالا موقع بستن فرم ارور میده. شکل زیر را ببینید.
153918

سوال دوم
وقتی مقدار کامبوباکس را با کلیک کردن و از لیست انتخاب میکنم ، مقدارها را میگیره و بر میگردونه . اما اگه مقدارهای داخل کامبوباکس ها را دستی و به وسیله صفحه کلید وارد کنیم ، مقدارها را صفر برمیگردونه .(مقدارهایی که در لیست کامبوباکس موجود هست) بابت این مورد باید چیکار کرد ؟

لطفا راهنمایی کنید
ممنون

ROSTAM2
پنج شنبه 30 تیر 1401, 17:07 عصر
سلام
برای CLOSE که گیرش کدهای مدیرت نشده ذکر کرده که دستوراتی هست که باید کارشون تموم شه تا فرم بتونه بسته بشه. همه دستوراتی که باهاش کار می کنی رو چک کن.

در مورد کامبو باکس هم SelectedItem رو خروجی بگیر.

prolog96
پنج شنبه 30 تیر 1401, 18:51 عصر
سلام
برای CLOSE که گیرش کدهای مدیرت نشده ذکر کرده که دستوراتی هست که باید کارشون تموم شه تا فرم بتونه بسته بشه. همه دستوراتی که باهاش کار می کنی رو چک کن.



ممنون جواب دادید . از شما سپاسگزارم
آخر کار یک تایمر دارم برای پروگرس بار . شاید احتمالا کار اون تموم نشده که ارور میده .

قبل از اینکه کلید خروج روشن بشه این خط را اضافه کردم . درست شد
Threading.Thread.Sleep(3000)




در مورد کامبو باکس هم SelectedItem رو خروجی بگیر

SelectedItem گذاشتم خطا نوع داده ، تو پروپرتی گرفت .

ROSTAM2
پنج شنبه 30 تیر 1401, 22:50 عصر
خوب ببین دیتا تایپی که به آیتم های کامبوباکس دادی چی هست دیتاتایپ خصوصیت رو هم همون تعیین کن.