PDA

View Full Version : مبتدی: چگونگی تغییر Tab در DataGridView



kh1387
جمعه 28 خرداد 1389, 09:14 صبح
با سلام
من یه دیتاگرید دارم. میخوام وقتی روی سلول اولی یعنی سطر اول از ستون اول اینتر رو زدم وارد سطر اول و ستون دوم شوم. و ستون به ستون جابجا شوم. درصورتیکه در دیتا گرید از سطر اول با اینتر به سطر دوم میریم.
چطوری این امر امکان پذیره؟
متشکرم

iman_me
جمعه 28 خرداد 1389, 13:00 عصر
با این کد می تونی کاری که می خوای رو انجام بدی



private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
this.KeyPreview = true;
SendKeys.Send("{up}");
SendKeys.Send("{left}");

}
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
this.KeyPreview = true;
if (e.KeyData == Keys.Enter)
{
SendKeys.Send("{up}");
SendKeys.Send("{left}");
}
}

kh1387
یک شنبه 30 خرداد 1389, 15:50 عصر
متشکرم از پاسختان
اما اگه از Left استفاده کنم کلا میره توی ستون اخر و نمیره توی ستون بعدی
:افسرده:

iman_me
یک شنبه 30 خرداد 1389, 16:12 عصر
خوب باید یک شرط هم بزاری که اگه به اخر رسید sendkey کن tab رو

kh1387
یک شنبه 30 خرداد 1389, 16:39 عصر
خوب باید یک شرط هم بزاری که اگه به اخر رسید sendkey کن tab رو
نه میدونم
میخوام مثلا از ستون اولی به دومی برم
ولی با Left میره آخری نمیره به ترتیب
:ناراحت:

iman_me
دوشنبه 31 خرداد 1389, 00:48 صبح
دوست من این کد واسه وقتی که راست به چپ گرید ویو فعال باشه
اگه نه پس باید بجای sendkey چپ بزاری راست

kh1387
سه شنبه 01 تیر 1389, 08:37 صبح
دوست من این کد واسه وقتی که راست به چپ گرید ویو فعال باشه
اگه نه پس باید بجای sendkey چپ بزاری راست
گذاشتم، ولی هیچ اتفاقی نیفتاد!:متفکر:

FastCode
سه شنبه 01 تیر 1389, 08:52 صبح
sendkeys فایده نداره.
یک:سعی کن از این روش استفاده نکنی چون کاربر رو گیج میکنه.و معمولاً منجر به اسپاگتی میشه
دو:راهش اینه:

public static void NextCell(Grid Grid, bool SelectByDyspID)
{
if (Grid.SelectionMode != DataGridViewSelectionMode.CellSelect) return;
if (SelectByDyspID)
{
Int32 Temp_ColDID = Grid.Columns[Grid.CurrentCellAddress.X].DisplayIndex;
Int32 Temp_ColID = 0;
Int32 Temp_RowID = Grid.CurrentCellAddress.Y;
do
{
Temp_ColDID++;
if (Temp_ColDID == Grid.ColumnCount)
{
Temp_ColDID = 0;
Temp_RowID++;
if (Temp_RowID == Grid.RowCount) break;
}
for (int C = 0; C <= Grid.Columns.Count - 1; C++‎‎)
{
if (Grid.Columns[C].DisplayIndex == Temp_ColDID)
{
Temp_ColID = C;
break;
}
}
if (Grid.Rows[Temp_RowID].Cells[Temp_ColID].Visible)
{
if (((Grid.Columns[Temp_ColID].Tag != null)) && Grid.Columns[Temp_ColID].Tag.GetType() == typeof(CellStayEventHandler))
{
CellStayEventHandler Deleg = (CellStayEventHandler)Grid.Columns[Temp_ColID].Tag;
bool Response = Deleg.Invoke(Temp_ColID, Temp_RowID, Grid.Rows[Temp_RowID].Cells[Temp_ColID].Value);
if (Response)
{
Grid.Rows[Temp_RowID].Cells[Temp_ColID].Selected = true;
if (Grid.Focused == false) return;
break;
}
}
else
{
if (!Grid.Rows[Temp_RowID].Cells[Temp_ColID].ReadOnly)
{
if (!Grid.Rows[Temp_RowID].Cells[Temp_ColID].Selected) Grid.Rows[Temp_RowID].Cells[Temp_ColID].Selected = true;
return;
}
}
}
}
while (true);
}
else
{
Int32 Temp_ColID = Grid.CurrentCellAddress.X;
Int32 Temp_RowID = Grid.CurrentCellAddress.Y;
do
{
Temp_ColID++;
if (Temp_ColID == Grid.ColumnCount)
{
Temp_ColID = 0;
Temp_RowID++;
if (Temp_RowID == Grid.RowCount)
break;
}
if (Grid.Rows[Temp_RowID].Cells[Temp_ColID].Visible)
{
if (((Grid.Columns[Temp_ColID].Tag != null)) && Grid.Columns[Temp_ColID].Tag.GetType() == typeof(CellStayEventHandler))
{
CellStayEventHandler Deleg = (CellStayEventHandler)Grid.Columns[Temp_ColID].Tag;
bool Response = Deleg.Invoke(Temp_ColID, Temp_RowID, Grid.Rows[Temp_RowID].Cells[Temp_ColID].Value);
if (Response)
{
Grid.Rows[Temp_RowID].Cells[Temp_ColID].Selected = true;
if (Grid.Focused == false) return;
break;
}
}
else
{
if (!Grid.Rows[Temp_RowID].Cells[Temp_ColID].ReadOnly)
{
Grid.Rows[Temp_RowID].Cells[Temp_ColID].Selected = true;
if (Grid.Focused == false) return;
return;
}
}
}
}
while (true);
}
}

سه:این کد رو تحت LGPL منتشر میکنم.

kh1387
سه شنبه 01 تیر 1389, 18:17 عصر
میشه راجع به کدتو ن توضیحی هم بدید؟
ممنونم

WTFisCsharp
سه شنبه 01 تیر 1389, 20:04 عصر
سلام
گویا اینجا کسی اطلاعات نمی ده . همشو مال خودتون نگه ندارید :عصبانی:
از این کامپوننت استفاده کن

public class MyDataGrid : DataGridView
{
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
if (msg.WParam.ToInt32() == (int)Keys.Enter)
{
SendKeys.Send("{Tab}");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
} همین
using system.windows.forms یادت نره :چشمک:
موفق باشی

FastCode
شنبه 05 تیر 1389, 23:33 عصر
سلام
گویا اینجا کسی اطلاعات نمی ده . همشو مال خودتون نگه ندارید :عصبانی:
از این کامپوننت استفاده کن

public class MyDataGrid : DataGridView
{
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
if (msg.WParam.ToInt32() == (int)Keys.Enter)
{
SendKeys.Send("{Tab}");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
} همین
using system.windows.forms یادت نره :چشمک:
موفق باشی


دوست عزیز اولا" که لازم نیست عصبانی بشی.دوما" کی می اطلاعات نمیده؟سوما" من کد به این قشنگی با قابلیت Alter کردن کلید و با دو روش Jump بر اساس Index و DisplayIndex و قابلیت پرش از روی ستون ها ReadOnly برای شما گزاشتم باز هم میگی بده.تازه پیچیدگیش هم n)O) هست.
در ضمن اگر SendKeys مثل UDP نبود حتما" من هیچ دلیلی برای نوشتن این کد نداشتم ولی دارم.
راستی اگر اون کامپوننت مال من سیستم عامله.