PDA

View Full Version : سوال: Enter in DataGridView



AmiN0012
پنج شنبه 05 آذر 1394, 10:29 صبح
سلام دوستان.من یگ گرید دارم که مقدار سلول هاشو دستی وارد میکنم.3 تا گزینه Enable گرید هم تیکشو زدم.
من با دستور زیر در رویداد keypress گرید گفتم اگر enter زدم تو مثل tab عمل کن.

if (e.KeyChar == 13)
SendKeys.Send("{tab}");

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

AmiN0012
پنج شنبه 05 آذر 1394, 11:49 صبح
پاسخ :

private void dataGridView1_KeyDown(object sender,KeyEventArgs e)
{
if(e.KeyCode==Keys.Enter)
{
e.SuppressKeyPress=true;
int iColumn = dataGridView1.CurrentCell.ColumnIndex;
int iRow = dataGridView1.CurrentCell.RowIndex;
if (iColumn == dataGridView1.Columns.Count-1)
dataGridView1.CurrentCell= dataGridView1[0, iRow +1];
else
dataGridView1.CurrentCell= dataGridView1[iColumn +1, iRow];
}
}

AmiN0012
جمعه 06 آذر 1394, 18:55 عصر
سلام دوستان کد بالا درست عمل میکنه درصورتی که در هیچ سلولی مقدار وارد نکنی.اما وقتی در یک سلول مقدار بنویسی دستی، با زدن اینتر دستور tab اعمال نمیشه.تریس کردم فهمیدم زمانی که متنی در یک سلول گرید مینویسی و بعد اینتر میزنی اصلا رویداد keydown فراخونی نمیشه.ممنون میشم کمکم کنید چیکار کنم تا حتی بعد وارد کردن اطلاعات بطور مستقیم در گرید با زدن اینتر باز دستور tab اعمال شه

AmiN0012
شنبه 07 آذر 1394, 09:14 صبح
دوستان ممنون میشم راهنماییم کنید.واقعا ضروریه برام

ژیار رحیمی
شنبه 07 آذر 1394, 11:57 صبح
سلام باید بصورت Custom Control این قابلیت رو به DataGrid اضافه کنی.کلاس زیر رو به پروژه ت اضافه کن بعد از ReBuild پروژه در بخش ToolBox از کنترل Dgv به جای کنترل DataGrid استفاده کن


public class Dgv : DataGridView
{
protected override bool ProcessDialogKey(Keys keyData)
{
var key = (keyData & Keys.KeyCode);
if (key == Keys.Enter)
return ProcessRightKey(keyData);
return base.ProcessDialogKey(keyData);
}
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
return ProcessRightKey(e.KeyData);
}
return base.ProcessDataGridViewKey(e);
}
}

AmiN0012
شنبه 07 آذر 1394, 13:19 عصر
متشکرم دوست عزیز.الان با این عمل ایا با نوشتن مقدار در گرید و زدن اینتر به سلول بعدی میره(tab اجرا میشه)؟یا اجازه نمیده اینتر بشه بره رویه سلوله زیری؟

AmiN0012
شنبه 07 آذر 1394, 16:28 عصر
من انجام دادم ولی اتفاق خاصی نیوفتاد.یعنی وقتی متنی در سلول گرید مینویسم و بعد اینتر میزنم کاری نمیکنه.
چطور در فاکتور نویسی سریع با زدن اینتر در گرید سل به سل رو مقدار مینویسن میرن جلو؟منم میخام همون کارو کنم

ژیار رحیمی
شنبه 07 آذر 1394, 16:33 عصر
ذوست گرامی من کد رو تست شده گذاشتم مشکلی نداره اگر مشکلی هست کدنون رو بزارید ببینیم مشکل از کجاست

AmiN0012
شنبه 07 آذر 1394, 16:43 عصر
من به عنوان تست ی گرید همانطور که شما گفتید گذاشتم.چندتا ستون دادم.از بانک نگرفتم بعد در رویداد keydown دستور زیر نوشتم.

private void dataGridView1_KeyDown(object sender,KeyEventArgs e)
{
if(e.KeyCode==Keys.Enter)
{
e.SuppressKeyPress=true;
int iColumn = dataGridView1.CurrentCell.ColumnIndex;
int iRow = dataGridView1.CurrentCell.RowIndex;
if (iColumn == dataGridView1.Columns.Count-1)
dataGridView1.CurrentCell= dataGridView1[0, iRow +1];
else
dataGridView1.CurrentCell= dataGridView1[iColumn +1, iRow];
}
}

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

ژیار رحیمی
شنبه 07 آذر 1394, 18:36 عصر
دوست گرامی لازم به کد در رویداد KeyDown دیتاگرید نیست (مشکل در فراخوانی این رویداد هست)من توضیح دادم کلاسش رو گذاشتم کدهای نوسته شده در رویداد KeyDown دیتاگرید بردارید

AmiN0012
شنبه 07 آذر 1394, 18:58 عصر
ممنونم دوست عزیز.حق با شما بود.فقط ی موضوعی.گرید من right to left ان yes است.وقتی از سلول اول اینتر میزنم جلو نمیره.اما از اخر شروع میکنم اینتر میزنم ی سل ی سل عقب میره.چرا؟

ژیار رحیمی
یک شنبه 08 آذر 1394, 02:27 صبح
برای حالت Right to Left

public class Dgv : DataGridView
{
protected override bool ProcessDialogKey(Keys keyData)
{
var key = (keyData & Keys.KeyCode);
if (key == Keys.Enter)
return ProcessLeftKey(keyData);// ProcessRightKey(keyData);
return base.ProcessDialogKey(keyData);
}
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
return ProcessLeftKey(e.KeyData);// ProcessRightKey(e.KeyData);
}
return base.ProcessDataGridViewKey(e);
}
}

AmiN0012
دوشنبه 16 آذر 1394, 15:29 عصر
دوستان فقط باید ذکر کنم اگر وارنینگ بخاطر این عمل گرفتید برید قسمت رفرنس و رفرنسی که همنام اسم پروژتون داره رو پاک کنید.حل دیگه.
منبع:
http://stackoverflow.com/questions/6790240/the-type-x-in-x-cs-conflicts-with-the-imported-type-x

skflower
چهارشنبه 15 اردیبهشت 1395, 08:56 صبح
دوست عزیز این کد رو عینا در پروژت کپی پیست کن مشکلت حل میشه


protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData) {
int icolumn = dataGridView1.CurrentCell.ColumnIndex;
int irow = dataGridView1.CurrentCell.RowIndex;
int i = irow;
if (keyData == Keys.Enter)
{
if (icolumn == dataGridView1.Columns.Count - 1)
{
//dataGridView1.Rows.Add();
if (notlastColumn == true)
{
dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[0];
}
dataGridView1.CurrentCell = dataGridView1[0, irow + 1];
}
else
{
dataGridView1.CurrentCell = dataGridView1[icolumn + 1, irow];
}
return true;
}
else
if (keyData == Keys.Escape)
{
this.Close();
return true;
}
//below is for escape key return
return base.ProcessCmdKey(ref msg, keyData);
//below is for enter key return
return base.ProcessCmdKey(ref msg, keyData);
}