سلام دو تا سوال داشتم
اول اینکه چطوری در سی شارپ میشه کاری کرد که کاربر وقتی مقادیر رو در فیلدها وارد میکنه با اینتر به فیلد بعد بره ؟
دوم اینکه در یک فیلد متنی چند خطه چطوری میشه خطوطی رو که می خواهیم جدا از هم باشند اینتر بزنیم ؟
با تشکر
Printable View
سلام دو تا سوال داشتم
اول اینکه چطوری در سی شارپ میشه کاری کرد که کاربر وقتی مقادیر رو در فیلدها وارد میکنه با اینتر به فیلد بعد بره ؟
دوم اینکه در یک فیلد متنی چند خطه چطوری میشه خطوطی رو که می خواهیم جدا از هم باشند اینتر بزنیم ؟
با تشکر
سلام دوست عزیز اینا خودش در خونش هست شما نیازی نیست بنویسید.
از DataGridView استفاده کنید.
موفق باشید.
سلامنقل قول:
اگر منظورتون از فیلدهای متنی همون TextBox هست شما باید در Event KeyPress تکست باکس مورد نظر کد زیر را بنویسید.
برای ایجاد فاصله بین خطوط TextBox ی که MultiLine هست میتونید از "r\n\" استفاده کنید.کد:if (e.KeyChar == 13)
{
System.Windows.Forms.SendKeys.Send("{TAB}");
}
نقل قول:
ممنون از شما
درست شد نکته که در مورد حرکت در فیلدها بهش برخودم وقتی که اینتر زده میشه و به فیلد بعد میره صدای بیپ از سیستم میاد نمیشه اینو یه کاریش کرد
بعد چطوری میشه به طور دستی اشاره گر رو به یه فیلد متنی که مورد نظر ماست هدایت کنیم ؟
ممنون
نقل قول:
کد قبلی رو به صورت زیر تغییر بدید, ببینید درست میشه نتیجه اش رو بگید.
کد:if (e.KeyChar == 13)
{
e.Handled = true;
System.Windows.Forms.SendKeys.Send("{TAB}");
}
else
base.OnKeyPress(e);
به طور مثال اگر بخواهید Focus رو به صورت دستی روی textbox1 قرار دهید, باید بنویسید:نقل قول:
کد:textbox1.Focus();
نشد دوست من روی OnKeyPass پیغام خطا میده :
با برداشتن قسمت else هم تغییری تو برنامه ایجاد نشدکد:Error 1 The best overloaded method match for 'System.Windows.Forms.Control.OnKeyPress(System.Windows.Forms.KeyPressEventArgs)' has some invalid arguments C:\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 480 17 WindowsFormsApplication1
Error 2 Argument '1': cannot convert from 'System.Windows.Forms.KeyEventArgs' to 'System.Windows.Forms.KeyPressEventArgs' C:\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 480 33 WindowsFormsApplication1
یه راه حل دیگه هم از توی نت پیدا کردم
به جای همه اونها شما فقط کد زیر رو کپی کنید در کلاس فرم مورد نظر. (کدهای روش قبل را پاک کنید)
کد:protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
if (keyData == System.Windows.Forms.Keys.Enter && this.AcceptButton == null)
{
System.Windows.Forms.TextBoxBase box = this.ActiveControl as System.Windows.Forms.TextBoxBase;
if (box == null || !box.Multiline) return this.ProcessDialogKey(System.Windows.Forms.Keys.Tab);
}
return base.ProcessCmdKey(ref msg, keyData);
}
بینهایت سپاسگزارم
درست شد تو این روش دیگه با رفتم به فیلد بعدی صدای بیپ از اسپیکر نمیاد فقط یه موردی اینجا پیش اومده که تو روش قبلی نبود وقتی با اینتر روی عناصر در حال حرکت هست وقتی روی یه دکمه میاد با اینتر به عنصر بعدی میره در صورتی که باید با اینتر روی دکمه ، برنامه اجرا بشه تا اونجا که برداشت کردم باید یه شرط بزاریم توی تابع که اگه دکمه ای با فلان نام بود کلا کد داخل تابع اجرا نشه چطوری باید نام عنصر فعلی رو دریافت و چک کنم یا یه راهی که این قضیه رو بشه کنترل کرد
ممنون
بهتر است نوع کنترل جاری رو چک کنید تا نام اوننقل قول:
شرطی که اضافه میکنیم اینه که اگر نوع کنترل جاری از جنس Button بود دستورات داخل if اجرا نشه
برای دسترسی به کنترل جاری از دستور this.ActiveControl استفاده میکنیم.
کد:protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
if (keyData == System.Windows.Forms.Keys.Enter && this.AcceptButton == null && this.ActiveControl.GetType() != typeof(System.Windows.Forms.Button))
{
System.Windows.Forms.TextBoxBase box = this.ActiveControl as System.Windows.Forms.TextBoxBase;
if (box == null || !box.Multiline) return this.ProcessDialogKey(System.Windows.Forms.Keys.Tab);
}
return base.ProcessCmdKey(ref msg, keyData);
}