PDA

View Full Version : حرکت بین کنترلها با زدن اینتر



c#_web
جمعه 30 فروردین 1387, 21:50 عصر
اگه بخواهیم با زدن دکمه اینتر به کنترل بعدی در فرم برویم ، که اینتر مثل tab کار کند چه کار باید کرد؟

Sub Zero
جمعه 30 فروردین 1387, 21:59 عصر
اگه بخواهیم با زدن دکمه اینتر به کنترل بعدی در فرم برویم ، که اینتر مثل tab کار کند چه کار باید کرد؟

Private Sub MyControl_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs)

If e.KeyCode = Keys.Enter Then
SendKeys.Send("{tab}")
End If
end sub
تنظیم tabIndex فراموش نشه

amirsajjadi
شنبه 31 فروردین 1387, 14:08 عصر
با این تابع هم میشه به کنترل بعدی رفت
روش کاربر Sub Zero خوبه ولی منطقی نیست


Me.GetNextControl(Control Start, True).Focus()

mazoolagh
شنبه 31 فروردین 1387, 20:59 عصر
راه درستش همین کد بالایی هست ولی بهتر است در بلوک try قرار داده باشه - چون اگر کنترل بعدی قابل focus نباشه error میده

Sub Zero
شنبه 31 فروردین 1387, 22:01 عصر
روش کاربر Sub Zero خوبه ولی منطقی نیست
خوب نمیخواستم بیشتر از این روی موضوع ریز بشم . مطالبی رو هم که میخوام بگم بارها در تاپیکهای مختلف در موردش صحبت شده اما باز هم برای اون دسته از دوستانی که آشنایی ندارن عنوان میکنم .
فرض کنید برنامه ای دارید با ده ها فرم و هر کدوم از این فرمها ده ها کنترل ورودی داره (نظیر TextBox) شما چه پیشنهادی برای حرکت بین کنترلها دارید؟
خوب اگه بخوایم طبق روش منطقی جناب سجادی عمل کنیم باید برای هر کنترل ، جداگانه رویداد KeyDown رو ایجاد و کد مربوطه رو درون این رویداد بنویسیم . علتش اینه که با این کد باید بدونیم روی چه کنترلی قراره فوکوس انجام بشه . پس نمیشه برای همه کنترلها یک رویداد نوشت (مگه با یک سری دستورات اضافی که اشاره به اونها خارج حوصله ماست.

برای اجتناب از این کار مراحل زیر را دنبال کنید .
یک کلاس به پروژه اضافه کنید و آن را بر اساس ارث بری از فرم تنظیم نمایید :

Public Class Pattern
Inherits Form
رویه زیر را به کلاس اضافه کنید . :

Sub Add_handler(ByVal Controls As Control)
For Each cnt As Control In Controls.Controls
If cnt.HasChildren Then
Add_handler(cnt)
Else
AddHandler cnt.KeyDown, AddressOf Process_KeyDown
End If
Next
End Sub
و این رویه را در رویداد لود کلاس فراخوانی کنید .:

Public Sub Pattern_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Add_handler(Me)
End Sub
رویه (Add_handler(Me به ازا هر کنترل موجود در فرم یک رویداد KeyDown ،در زمان اجرا ایجاد میکند .

در مرحله بعد دستورات رویداد KeyDown را بنویسید .:

Private Sub MyControl_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs)
If e.KeyCode = Keys.Enter Then
SendKeys.Send("{tab}")
End If
End sub
بسته به نیازتون میتونید رویدادهای دیگری را در رویه Add_handler ایجاد کنید.
شاید بگید این همه کد برای یک کار کوچولو ؟
خوب مزیت این کدها یک بار نوشتن و چندین بار استفاده هست. مراحل بعد رو هم دنبال کنید تا قضیه براتون روشنتر بشه .
بعد ازاینکه کلاستون رو ذخیره کردید . از این به بعد هر فرمی رو که به پروژتون اضافه میکنید. خاصیت ارث بری اون بر اساس کلاس ایجاد شده تنظیم کنید. مثال :

Public Class MyForm
Inherits Pattern
با این کار فرم جدید تمام خواص اون کلاس رو به ارث می بره ، با انجام مراحل فوق شما میتونید بدون نوشتن حتی یک خط کد در فرمهاتون ، با زدن اینتر به کنترل بعدی برید . فقط کافیه یک بار بنویسید و چندین بار استفاده کنید.
کلاس ضمیمه شده نمونه ای از این کارهاست .

amirsajjadi
یک شنبه 01 اردیبهشت 1387, 13:18 عصر
سلام Sub Zero جان
من اسجدی نیستم ، سجادی هست !!!
بعدشم توی رویداد Form_KeyDown اگه این قطعه کد رو بنویسی و KeyPreview فرم رو هم True کنی دیگه نیازی نیست برای همه ی کنترلها این کد رو تکرار کنی
کد شما درست هست ولی اگه فوکاس رو فرم نباشه (روی برنامه ای دیکه مثل Notepad باشه) و قطعه کد Sendkey اجرا بشه در واقع کلید Tab رو روی برنامه ای مثل Notepad اجرا میکنه نه روی فرم

Sub Zero
یک شنبه 01 اردیبهشت 1387, 15:10 عصر
سلام Sub Zero جان
توی رویداد Form_KeyDown اگه این قطعه کد رو بنویسی و KeyPreview فرم رو هم True کنی دیگه نیازی نیست برای همه ی کنترلها این کد رو تکرار کنی
[/COLOR]
جناب سجادی اگه فایل ضمیمه رو نگاه کرده باشید و مطالب رو هم خونده باشید عرض کردم که بسته به نیازتون میتونید رویدادهای دیگری را در رویه Add_handler ایجاد کنید. واقعیت هم همینه ،اصلا ارزش نداره فقط برای حرکت بین کنترلها یه کلاس جداگونه درست کنیم . توی کلاسی که قرار دادم حتی کدی رو برای زمانی که کاربر میخواد یک رکورد رو از دیتاگرید حذف کنه نوشتم (پیغامی مبنی بر اطمینان از حذف رکورد) .
در مورد KeyPreview فرم و رویداد Form_KeyDown که شما پیشدستی کردید . قصد داشتم امروز اون رو هم به تاپیک اضافه کنم . حالا زحمت اضافه کردنش با خودتون .


اگه فوکاس رو فرم نباشه (روی برنامه ای دیگه مثل Notepad باشه) و قطعه کد Sendkey اجرا بشه در واقع کلید Tab رو روی برنامه ای مثل Notepad اجرا میکنه نه روی فرم
شاید من درست متوجه نشدم . اما با عقل جور در نمیاد برنامه ای مثل Notepad جلوی کاربر باشه و اون بخواد بین کنترلها حرکت کنه . اصلا تا فوکوس روی فرم نباشه کدهای حرکت بین رکوردها اجرا نمیشن .

elmira_63
یک شنبه 03 شهریور 1387, 15:54 عصر
با این تابع هم میشه به کنترل بعدی رفت
روش کاربر Sub Zero خوبه ولی منطقی نیست


Me.GetNextControl(Control Start, True).Focus()


من از ین کد استفاده کردم و به جای Control Start یکی از تکست باکس هام رو نوشتم چون همین طوری به این دوتا کلمه ایراد می گرفت ولی وقتی اینتر می زنم فقط روی همون تکست باکسی که نوشته بودم فوکوس میشه
چیکار باید بکنم؟؟؟

Reza Safa
دوشنبه 04 شهریور 1387, 10:10 صبح
خوب دوست عزیز نام جعبه متنی که می خواهی فوکوس کنی را بده
-------------------
چندتا راه داره
تگ هر جعبه متن را شماره های پشت هم بده 1 2 3 4 ...
بهد به کمک for each جعبه متن فعلی را پیدا کن و به خونه بعدی فوکوس بده

parsavb
دوشنبه 04 شهریور 1387, 10:57 صبح
ابتداخاصیتKeyPreview فرم رو True کن و بعد کد زیر رو بنویس



PrivateSub Form1_KeyDown(ByVal sender AsObject, ByVal e As System.Windows.Forms.KeyEventArgs) HandlesMe.KeyDown
If e.KeyCode = Keys.Enter Then
Me.ProcessTabKey(True)
EndIf
EndSub


با این روش فرقی نمی کنه که کنترلها چی هستند

kablayi
سه شنبه 05 شهریور 1387, 00:55 صبح
ابتداخاصیتKeyPreview فرم رو True کن و بعد کد زیر رو بنویس



PrivateSub Form1_KeyDown(ByVal sender AsObject, ByVal e As System.Windows.Forms.KeyEventArgs) HandlesMe.KeyDown
If e.KeyCode = Keys.Enter Then
Me.ProcessTabKey(True)
EndIf
EndSub


با این روش فرقی نمی کنه که کنترلها چی هستند

سلام ...
روش شما هم جالبه ...

در کل به نظرم روش sub zero بهتر باشه ...

در کد sub zero قسمتهای قرمز رنگ رو تغییر دادم مشکل برای همه control ها حل میشه ...



Private Sub txteditID_ KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txteditID.KeyPress, txteditname.KeyPress, txteditcomm.KeyPress
If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Enter) Then
SendKeys.Send("{TAB}")
End If
End Sub


با این روش مدیریت لازم رو روی اینتر زدن روی کنترلها داریم فرضا ممکنه کنترل بعدی یه Richtext box که با این کار به خط بعدی در همون کنترل میریم پس نام اونو در handles این sub نمینویسیم ....


موفق باشید ...

sekhavat
جمعه 15 شهریور 1387, 01:34 صبح
سلام
عالي بود اين قسمت منو خيلي كمك كرد
مرسي