PDA

View Full Version : تغییر فوکوس در فرم‌های طراحی شده در VB.Net 2005



hamidyha
دوشنبه 17 اردیبهشت 1386, 09:08 صبح
سلام . من فرمی طراحی کردم (تصویر ضمیمه) در هنگام لود شدن فرم فوکوس روی دکمه 1 است وقتی که فرآیند مربوطه اجرا می‌شود و از فرم خروج می‌کنیم فوکوس دکمه 4 می‌شود. اگر دوباره همین فرم را باز کنم فوکوس روی دکمه 4 است در صورتی که باید روی دکمه یک باشد. راههای مختلفی روی اجرا کردم و حتی در هنگام لود شدن فرم فوکوس رو روی دکمه 1 ست کردم ولی جواب نداد . اگه ممکنه یکی از دوستان راهنمایی کنه. متشکرم

saeed_rezaei
دوشنبه 17 اردیبهشت 1386, 12:18 عصر
دوست من، شما مشخص کنید، بعد از کلیک بر روی دکمه شماره 4، چه اتفاقی برای فرم می افته.
close
hide
visible=false

hamidyha
دوشنبه 17 اردیبهشت 1386, 14:58 عصر
دکمه 4 فرمان close است . لازم توضیح است که فرقی نمی کنه روی هر دکمه باشی و پنجره رو ببندی فوکوس روی همان دکمه باقی می‌ماند. شاید فرم در حافظه است و باید حافظه رو خالی کنم . در VB6 قبل از نمایش دستورات Load و هنگام بستن Unload بکار می‌رفت ولی در VB.net 2005 نمی‌دانم. متشکرم

__H2__
دوشنبه 17 اردیبهشت 1386, 16:48 عصر
سلام
اجبار حرکت فکس به کنترلی خاص
Me.Controlname.Focus

مثلاَ میتوانید آن را در Form_Load قرار دهید.

برای بستن فرم باید متد Close عضو فرم را فراخانی کنید
نابود سازی هم نیازی نیست، این وظیفه جمع آوری کننده حافظه هرز فریم وروک است، ولی اگر نابودی و از RAM بیرون رفتن یک کنترل را میخواهید میتوانید متد Dispose فرم را فراخانی کنید.

hamidyha
سه شنبه 18 اردیبهشت 1386, 11:43 صبح
از همین دستور Me.Controlname.Focus جهت کنترل فوکوس استفاده کردم ولی کنترل دقیقاً به همان شکل توضیح 1 می‌باشد. برای بستن پنجره از فرمان Me.Close استفاده می‌کنم.

saeed_rezaei
سه شنبه 18 اردیبهشت 1386, 14:03 عصر
ببینید دوست من، قضیه باز و بسته کردن فرمها توی دات نت کمی متحول شده. در دات نت برای اجرای یک فرم باید یک کلاس نمونه از فرم بسازید. مثل وی بی 6 نمی تونید مستقیم فرم رو اجرا کنید برای مثال اگه قصد فعال سازی Form1 رو دارید باید بنویسید:

dim myform as new form1
myform.show
با این دستورات یک فرمی شبیه form1 در حافظه فعال می شه. این فرم، از نوع فرم مادر هستش نه خود اون. پس هر بار این دستورات را اجرا کنید یک فرم جدید به تعداد فرماتون اضافه می شه.

برای بستن یک فرم نیز از همین روش me.close استفاده می شه. این متد باعث می شه که این کلاسی که شبیه سازی شده، تمام اجزایی و منابعی رو که از سیستم گرفته دوباره به سیستم برگردونه.

متد دیگری هم هست با نام load که در وی بی 6 هم داریم. هر بار که فرمی به حافظه بار می شه، این تابع اجرا می شه.

حالا این نکته مهم رو مد نظر داشته باشید که باید درون این تابع فوکاس رو انتقال بدید. یعنی زمانی فرم در حافظه بار شد، اتوماتیک فوکاس رو به اونجا انتقال بده.
و مهمتر اینکه، تابع Load فقط یک بار بعد از ایجاد و به حافظه بار شدن فرم رخ می ده. به عبارتی اگه شما، فرم رو Hide, minimize, visible=false و یا هر روش مشابه ای بزنید، باید به خاطر داشته باشید که دیگه رخداد load اتفاق نمی افته.
چیزهایی که نوشتم، مواردی بود که به مطمئنم رخ می دهند. اما چنانچه هنوز مشکلی دارید، پیشنهاد می کنم کد فرم تون رو همین جا بزنید تا دوستان راحت تر مشکلتون رو بررسی کنند.

rezaei manesh
سه شنبه 18 اردیبهشت 1386, 14:24 عصر
سلام
من با سعید کاملا موافقم و مطمئن هستم که شما از روش زیر برای نمایش فرم تان استفاده می کنید
my.forms.frmName.show OR showdialog
اگه کلاس نمونه بگیرید مشکل حل می شه
اگر هم نمی خواهید می توانید اگه تو فرم لود فوکوس کار نکرد که باید کار کنه (احتمالا تو یکی از توابع فوکوس رو تغییر می دید) توی Activated فرم فوکوس رو ست کنید.

__H2__
سه شنبه 18 اردیبهشت 1386, 14:53 عصر
سلام
دستور همان است ولی به جای Form_Load در Form_Shown آنرا بنویسید.

موفق باشید.

hamidyha
سه شنبه 18 اردیبهشت 1386, 16:38 عصر
با سلام
متشکرم از شما دوستان عزیز. کد یکی از فرم‌ها رو در زیر می‌نویسم. این فرم از فرم main اجرا می‌شه با متد frm_group.showdialog()

Public Class frm_group
Private Sub frm_group_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = "گروه های کاری"
Me.cmd_new.Enabled = True
Me.cmd_del.Enabled = True
Me.cmd_edit.Enabled = True
Me.cmd_quit.Enabled = True
Me.cmd_save.Enabled = False
Me.cmd_cancle.Enabled = False
Me.txt_name.Enabled = False
Me.txt_sharh.Enabled = False
Me.txt_name.Text = ""
Me.txt_sharh.Text = ""
With frm_main.StatusStrip1
.Items.Add("اگروه های کاری")
.Items.Add("|")
End With
End Sub
Private Sub cmd_quit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_quit.Click
Me.Close()
With frm_main.StatusStrip1
.Items.Clear()
.Items.Add("نام کاربر : " + var_username)
.Items.Add("|")
.Items.Add(" سال : " + var_sal)
.Items.Add("|")
End With
End Sub
Private Sub cmd_new_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_new.Click
Me.cmd_new.Enabled = False
Me.cmd_del.Enabled = False
Me.cmd_edit.Enabled = False
Me.cmd_quit.Enabled = False
Me.cmd_save.Enabled = True
Me.cmd_cancle.Enabled = True
Me.txt_name.Enabled = True
Me.txt_sharh.Enabled = True
Me.txt_name.Text = ""
Me.txt_name.Focus()
cn.ConnectionString = connect
cn.Open()
cmd.CommandText = "Select row FROM group_work"
Dim introw As Integer = CInt(cmd.ExecuteScalar())
If introw = 0 Then
introw += 1
Else
cmd.CommandText = "Select MAX (row) FROM group_work"
introw = CInt(cmd.ExecuteScalar())
introw += 1
End If
Me.lbl_row.Text = introw
cmd.ExecuteNonQuery()
cn.Close()
End Sub
Private Sub cmd_save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_save.Click
cn.ConnectionString = connect
cn.Open()
cmd.CommandText = "INSERT INTO group_work(row,name,sharh,creator,register) " & _
"VALUES('" & Me.lbl_row.Text & "' , '" & Me.txt_name.Text.Trim & "','" & _
Me.txt_sharh.Text.Trim & "' ," & var_creator & " , '" & TimeString & "-" & datef & "')"
cmd.ExecuteNonQuery()
cn.Close()
Me.cmd_new.Enabled = True
Me.cmd_del.Enabled = True
Me.cmd_edit.Enabled = True
Me.cmd_quit.Enabled = True
Me.cmd_save.Enabled = False
Me.cmd_cancle.Enabled = False
Me.txt_name.Enabled = False
Me.txt_sharh.Enabled = False
Me.txt_name.Text = ""
Me.txt_sharh.Text = ""
Me.lbl_row.Text = ""
var_massage = "گروه کاری جدید ثبت شد"
frm_massage.ShowDialog()
End Sub
Private Sub cmd_cancle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_cancle.Click
Me.cmd_new.Enabled = True
Me.cmd_del.Enabled = True
Me.cmd_edit.Enabled = True
Me.cmd_quit.Enabled = True
Me.cmd_save.Enabled = False
Me.cmd_cancle.Enabled = False
Me.txt_name.Enabled = False
Me.txt_sharh.Enabled = False
Me.txt_name.Text = ""
Me.txt_sharh.Text = ""
Me.lbl_row.Text = ""
End Sub
Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs ) Handles LinkLabel1.LinkClicked
frm_group_show.ShowDialog()
End Sub
Private Sub LinkLabel1_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkLabel1.MouseHover
Me.LinkLabel1.ForeColor = Color.Red
End Sub
Private Sub LinkLabel1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkLabel1.MouseLeave
Me.LinkLabel1.ForeColor = Color.Blue
End Sub
Private Sub cmd_edit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_edit.Click
frm_group_edit.ShowDialog()
End Sub
End Class

rezaei manesh
سه شنبه 18 اردیبهشت 1386, 17:31 عصر
اگه منظورت رو درست فهمیده باشم این خط را باید به فرم لود اضافه کنی تا فوکوس رو دکمه cmd_new باشه موقع باز شدن فرمت


Me.cmd_new.Focus()

hamidyha
سه شنبه 18 اردیبهشت 1386, 18:05 عصر
مساله این که فوکوس دکمه هر جا که تعریف کنی فرم پاشو کرده تو یک کفش و هر وقت که از فرم خارج می‌شی یا با زدن دکمه خروج و دکمه × سمت راست بالای فرم فوکوس روی هر دکمه باشه در موقع لود شدن بازهم همون دکمه است مگر اینکه از کل برنامه با دستور End خارج بشیم. نمی‌دونم منظور من رو فیمیدین یا نه ؟ بهر حال از کمک شما مشتکرم

hamidyha
چهارشنبه 19 اردیبهشت 1386, 08:57 صبح
آیا با ایجاد کلاس جدید از فرم این مشکل حل میشه؟

__H2__
چهارشنبه 19 اردیبهشت 1386, 09:35 صبح
سلام
متاسفانه وقت نکردم کدهای شما را مطالعه کنم ولی مجدداَ تاکید که دستور تغییر فکس را در رویداد Form_Shown قرار دهید، باید مشکلتان حل شود.

rezaei manesh
چهارشنبه 19 اردیبهشت 1386, 10:27 صبح
آیا با ایجاد کلاس جدید از فرم این مشکل حل میشه؟

100% بله


dim f as new yourfrmName
f.showdialog

hamidyha
چهارشنبه 19 اردیبهشت 1386, 10:33 صبح
یعنی همیشه باید یک کلاس جدید درست کرد یا نه؟
اگر فوکوس در رویداد Form_Activate یا Form_shown قرار گیرد مشکل فوکوس حل می‌شود. با تشکر از همه دوستانی که در حل مشکل من راهنمایی داشتند. امیدوارم همه موفق و سلامت باشند. با تشکر

rezaei manesh
چهارشنبه 19 اردیبهشت 1386, 10:45 صبح
نه نیاز نیز همیشه این کار رو بکنیم تو فرم لود یا activate یا shown اگه فوکوس رو به کنترل مورد نظر بدیم باید مشکل حل بشه اما در این مورد خاص شما می تونید کلاس جدید بگیرید .
من یه مشکل مشابه داشتم به این صورت که دیتا گراید رو بعد از پر شدن یه خط در میان رنگی می کردم اما این کد فقط همون دفعه اول کار می کرد دفعات بعد دیگه رنگی نبود و... هر کاری می کردم نمی شد اما وقتی کلاس جدید می گرفتم میشد اما من روش رو عوض کردم و تویه disign گراید رو تنظیم کردم و... و مشکل حل شد . اما این سوال برای من همچنان باقی موند که چرا این طور هست در اونجا حتی اگه بگیم آخرین تنظیمات در حافظه می مونه پس باز هم باید درست کار می کرد و..؟!!!!!!!!!!!
خوشحالم که مشکل شما حل شد.

hamidyha
چهارشنبه 19 اردیبهشت 1386, 10:54 صبح
متشکرم از توجه شما به نکته خوبی اشاره کردید چون من هم همین مشکل رو دارم و هنوز فرصتی دست نداده زیاد روی این قضیه کار کنم ولی در نظر داشتم بتونم یک سلول رو رنگشو عوض کنم بر اساس عبارت خاصی. ظاهراً کامپونتهای جدیدی آمده که امکاناتش از گرید خود VS بیشتره مثلاً یکی میتونه گرید مرتب کنه بر اساس هدرش یعنی شما با موس هدر رو گرفته و با بالای گرید می‌برید و بعد اطلاعات بر اساس اون دسته بندی می‌شه ولی من نتونستم اینکارو در VB.Net انجام بدم اگر در این زمینه اطلاعاتی دارید منو راهنمایی کنی.

rezaei manesh
چهارشنبه 19 اردیبهشت 1386, 11:02 صبح
تغییر رنگ سطر گراید ویو


Private Sub ChangeRowBackColor(ByRef dg As DataGridView, ByVal Row As Integer, ByVal color As Color)
Dim myStyle As New System.Windows.Forms.DataGridViewCellStyle
myStyle.BackColor = color
Dim cell As DataGridViewCellCollection = Me.DataGridView1.Rows(Row).Cells
For i As Integer = 0 To cell.Count - 1
cell.Item(i).Style = myStyle
Next
End Sub

ehsangfl
پنج شنبه 18 مرداد 1386, 10:38 صبح
با سلام
من تو برنامه هام همیشه از تابع select کنترلها تو تابع load فرم استفاده می کنم و به درستی فوکوس رو انتخاب می کنه و اون کلاس رو new نمی کنم. نمی دونم چرا از این تابع استفاده نمی کنید. اگه ایرادی داره این کار بگید که منم استفاده نکنم. مثلا اگه یه دکمه با نام btn رو بخوام هر جا روش فوکوس داشته باشم همونجا این خطو می نویسم.
btn.select()