PDA

View Full Version : مقاله: غیر فعال کردن کار پیش فرض enter در دیتا گرید



sima1984
چهارشنبه 31 تیر 1388, 10:59 صبح
با سلام
ایا کسی می دونه که چطور میتونیم کار پیش فرض کلید enter رو در دیتا گرید غیر فعال کنیم و فقط کار مورد نظر خود مون رو برای enter بنویسیم من می خوام بازدن enter روی سلولها به
طرف پایین حرکت نکنه که کار پیش فرض خود enter در دیتا گرید

Thanks in Advance

hozouri
چهارشنبه 31 تیر 1388, 11:14 صبح
توی این تاپیک یه گرید سفارشی هست که این امکان رو به شما میده ...

http://barnamenevis.org/forum/showthread.php?t=64210&page=30

2 تا نسخه ازش هست نسخه آخریش کامل تره

sima1984
چهارشنبه 31 تیر 1388, 11:25 صبح
ممنون ولی من خود م دارم یک گرید سفارشی مینویسم با امکانات مختلف فعلا فقط همین مشکل رو دارم یعنی نمی خوام با زدن اینتر پایین بره اگه لطف کنید و در نوشتنش راهنمایی کنین ممنون میشم

hozouri
چهارشنبه 31 تیر 1388, 11:41 صبح
خب دوست عزیز اینکه مشکلی نیست شما می تونید این رو از همون کامپوننت به ارث ببرید.

نسخه جدیدترش هم آپدیت کردم که در توضیحات گفتم چی کار می کنه.

sima1984
پنج شنبه 01 مرداد 1388, 12:01 عصر
من از این کد استفاده کردم


if (e.KeyCode == Keys.Enter) {
e.SuppressKeyPress = true;
}

در حالت اولیه یعنی وقتی برای اولین بار در گرید دیتا وارد می کنم کار می کنه یعنی با زدن enter دیگه رو ی گرید به سمت پایین حرکت نمی کنه و فقط کد مورد نظر خودم رو انجام می ده ولی وقتی یک سلول رو ویرایش می کنم یا پاک میکنم و دوباره مینویسم
باز بازدن اینتر به سمت پایین حرکت می کنه
چطور باید این مشکل رو حل کنم
Thanks in Advance

Evil 69
پنج شنبه 01 مرداد 1388, 13:39 عصر
وقتی Enter فشار داده شد کار هایی رو که می خوایین بکنین و بعد مقدار مربوط به کد کلید برگشت داده شده رو به Null تغییر بدین . اینطوری برای کنترل گرید هیچ مقداری فرستاده نمی شه

sima1984
شنبه 03 مرداد 1388, 09:58 صبح
اینکار رو نتونستم انجام بدم چون فقط get هستند و مقداری رو دریافت نمی کنند

sima1984
شنبه 03 مرداد 1388, 11:04 صبح
آقای حضوری لطف میکنین اگه کمک کنید من زیاد فرصت ندارم و البته باید خودم بنویسم یعنی نمیتونم از کامپوننت شما ارث ببرم

Mohsen229266
شنبه 03 مرداد 1388, 12:57 عصر
سلام دوست من برای DLL میخواید یا در برنامه میخواید استفاده کنید فرق زیادی هم نداره
برای هر کدومش که میخواید بگید کدشو میزارم

hozouri
شنبه 03 مرداد 1388, 13:31 عصر
شرمنده اگر دیر راهنماییتان کردم کمی سرم شلوغ بود ببخشید ...

اینم لینک توضیحات :

حرکت در بین سلول های سطر جاری (http://barnamenevis.org/forum/showthread.php?p=764448#post764448)

sima1984
یک شنبه 04 مرداد 1388, 09:56 صبح
از کمکتون ممنون ولی من نتونستم ازش استفاده کنم میشه بیشتر توضیح بدین من این کد ر و که استفاده کردم همه کلید هارو به left پاس میده

hozouri
یک شنبه 04 مرداد 1388, 10:04 صبح
دوست عزیز باید در همون قسمت کد سطر و ستون جاری رو بگیری و همون رو پاس بدی به grid.

sima1984
یک شنبه 04 مرداد 1388, 11:18 صبح
دوست محترم mohsen229266
من دارم یک کامپوننت گرید می نویسم فکر نمیکنم چندان تفاوتی داشته باشه اگه کد برای dll رو بذارین فکر کنم بهتر باشه
ممنون

Mohsen229266
یک شنبه 04 مرداد 1388, 15:14 عصر
با سلام ضمن تایید برنامه خوب دوستمون جناب hozouri
من این برنامه رو هم اضافه میکنم (http://barnamenevis.org/forum/attachment.php?attachmentid=33972&d=1248606375)

sima1984
دوشنبه 05 مرداد 1388, 12:07 عصر
با تشکر ار دوستان محترم حضوری و mohsen
من از کدتون استفاده کردم و مشکلم حل شد ولی به یک مشکل دیگه بر خوردم من در دیتا گریدم یک خصوصیت اضافه کردم که در اون شماره سلولهایی که اجازه null بودن دارند وارد میشه حالا برای ایجاد سطر جدید با اینتر ابتدا بررسی میشه که اگه سلولهایی که اجازه null بودن ندارند null باشن سطر جدید ایجاد نمیشه ولی با استفاده از کد شما همیشه سلول آخر رو null میگیره




protectedoverridebool ProcessDialogKey(Keys keyData)
{
char sep = ',';
int colIndex = base.CurrentCell.ColumnIndex;
int numberofrow = base.RowCount;
bool allownull = false;
bool newrow = true;
int numberofcol = base.CurrentRow.Cells.Count;
string[] cellnull = G_canbenull.Split(sep);

Keys key = (keyData & Keys.KeyCode);

if (key == Keys.Enter)
{
iffor (int i = 0; i < numberofcol-1;
{
foreach (string c in cellnull)
{
if (i.ToString() == c)
{
allownull = true;
break;
}
else allownull = false;
}
if (!allownull & base.CurrentRow.Cells[i].Value == null)
{

newrow = false;

}
}//endfor
if (newrow && base.CurrentCell.ColumnIndex == numberofcol - 1 && base.CurrentRow.Index == numberofrow - 1)
{


this.Rows.Add();
SendKeys.Send("{Down}");
if (this.RightToLeft == RightToLeft.Yes)
{
SendKeys.Send("^{Right}");
}
else
{
SendKeys.Send("^{Left}");
}



}
}
}


returnthis.ProcessTabKey(keyData);
}

returnbase.ProcessDialogKey(keyData);

}



Cellnull رشته ایست که اندیس ستونهایی که اجازه null بودن دارند در آن نگهداری میشود

اگه باز هم راهنمایی کنین ممنون میشم

hozouri
دوشنبه 05 مرداد 1388, 12:46 عصر
دوست عزیز این یه حالته خاصه و این بخاطره اینه که شما دارید اون سلول را ویرایش می کنید ...

من برای حل این مشکل وقتی کرسر روی سلول آخری بود از دستور زیر برای Refresh شدن سلول استفاده می کردم ...



sendkeys(^{Right});
sendkeys(^{Right});
sendkeys(^{left});


توجه داشته باشید که دقیقاً 3 دستور را بنویسید ...

بعد دستورات دیگه رو بذارید

البته این برای right to left هست

Mohsen229266
دوشنبه 05 مرداد 1388, 20:20 عصر
اگه منظورتونو درست متوجه شده باشم میخوای وقتی در سلول آخر هستید تمامی سلول های سطر قبلی (به غیر از سلول هایی که اجازه Null بودن دارن) چک بشن که اگه Null بودن در این صورت سطری اضافه نشه حتی در سطر آخر حرفی تایپ نشه که باعث ایجاد سطر جدید بشه درسته؟
شما وقتی روی سلول آخرید تک تک سلول های سطر قبلی رو میتونید چک کنید اگر شرط شما نقض شد
سطر جدید اضافه نشه و برای تایپ نشدن حروف در سطر آخر شما میتونید یک ایونت برای دیتاگرید بنویسید اگه مشکل همین بود بگید کدشو بزارم
در ضمن وقتی بجای Enter شما Tab رو برمیگردونید نیازی به چک کردن Right To Left نیست

sima1984
سه شنبه 06 مرداد 1388, 09:33 صبح
اقای حضوری ضمن تشکر من از کد شما استفاده کردم ولی یه کم مشکل داشتم
من این رو اضافه کردم


if (base.CurrentCell.ColumnIndex == numberofcol - 1)
{
SendKeys.Send("^{Right}");
SendKeys.Send("^{Right}");
SendKeys.Send("^{Left}");

}
foreach (string c in cellnull)
{
if (base.CurrentRow.Cells[numberofcol - 1].ColumnIndex.ToString() == c)
{
allownull1 = true;
break;
}
else allownull1 = false;
}
if (!allownull1 & base.CurrentRow.Cells[numberofcol - 1].Value == null)
{

newrow = false;

;
}



اگر newrow ،false باشه یعنی حداقل یکی از سلولهایی که اجازه ندارن null باشن خالی بودن
مشکلاتی که من دارم:
1-باید روی سلول اخر دوبار اینتر زده بشه تا سطر جدید ایجاد بشه
2-وقتی چندین سطر داریم بازدن اینتر روی سلولها وقتی روی سلول اخر سطر اول میرسه به سلول پایینی میره و به همین ترتیب یعنی بعد از رسیدن به سلول اخر سطر اول اینتر مثل down عمل میکنه


البته من یه مشکل دیگه هم دارم و اون اینه که می خوام وقتی مقدار سلول یک مقدار خاصی باشه اینتر از رو ی اون جلو نره

لطف میکنین اگه باز هم کمک کنین

Mohsen229266
سه شنبه 06 مرداد 1388, 11:35 صبح
اگر newrow ،false باشه یعنی حداقل یکی از سلولهایی که اجازه ندارن null باشن خالی بودن
مشکلاتی که من دارم
در این صورت میخواید سطر جدید ایجاد نشه؟

دوست من برای مشکل دوم



this.CurrentCell = this[0, this.CurrentRow.Index];

sima1984
سه شنبه 06 مرداد 1388, 11:58 صبح
ممنون
اگه بتونین در 2 مورد زیر هم کمک کنین خیلی لطف کردین
1-وقتی با اینتر به سلول اخر میرسم بعد از وارد کردن مقدار این سلول باید دو بار اینتر زده بشه تا سطر بعد ایجاد بشه یعنی فکر میکنم دفعه اول این سلول رو null در نظر میگیره
2-چطور میتونم بررسی کنم که در صورتی که مقدار ورودی یک سلول مجاز نباشد اینتر از روی آن حرکت نکند


protectedoverridebool ProcessDataGridViewKey(KeyEventArgs e)
{


if (e.KeyCode == Keys.Enter){

for (int i = 0; i < numberofcol-1; i++)
{


foreach (string c in cellnull)
{
if (i.ToString() == c)
{
allownull = true;
break;
}
else allownull = false;
}
if (!allownull & base.CurrentRow.Cells[i].Value == null)
{
newrow = false;
// return;

}
}//endfor
if (base.CurrentCell.ColumnIndex == numberofcol - 1 && base.CurrentRow.Index==numberofrow-1)
{
SendKeys.Send("^{Right}");
SendKeys.Send("^{Right}");

SendKeys.Send("^{Left}");
}
foreach (string c in cellnull)
{
if (base.CurrentRow.Cells[numberofcol - 1].ColumnIndex.ToString() == c)
{
allownull1 = true;
break;
}
else allownull1 = false;
}
if (!allownull1 & base.CurrentRow.Cells[numberofcol - 1].Value == null)
{
newrow = false;

}
if (newrow && base.CurrentCell.ColumnIndex == numberofcol - 1 && base.CurrentRow.Index == numberofrow - 1)
{



this.Rows.Add();
SendKeys.Send("{Down}");
if (this.RightToLeft == RightToLeft.Yes)
{
SendKeys.Send("^{Right}");
}
else
{
SendKeys.Send("^{Left}");
}



}
ProcessTabKey(e.KeyData);

}

else
returnbase.ProcessDataGridViewKey(e);
}


من اول برسی میکنم سلولهایی که مجاز نیستند null باشند، خالی نباشند (در غیر اینصورت سطر جدید نباید ایجاد شود) بعد سول اخر رو همون طور که دوستمون گفتن refresh میکنم بعد برای اون هم خالی نبودنش رو بررسی میکنم
اگر همه چیز درست بود سطر جدید ایجاد میشه

Mohsen229266
سه شنبه 06 مرداد 1388, 12:37 عصر
شما میخواید وقتی مقدار مجاز نبود نه با enter و نه با کلیک به cell بعد نره؟
هم میتونید از ایونت CellValidating استفاده کنید هم میتونید خودتون براش کد بنویسید که اینطوری بهتره
اگر از CellValidating استفاده کنید فوکوس برنامه تا زمانی که مقدار صحیح وارد نشده روی اون سلوله که اصلا خوب نیست یعنی تا مقدار درست وارد نشه به هیچ کنترل حتی فرم هم نمیتونید دسترسی داشته باشید
این برای Enter که شرط اونو خودت تغییر بده


protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (this[this.CurrentCell.ColumnIndex, this.CurrentRow.Index].Value == null)
return false;
else
returnthis.ProcessTabKey(e.KeyData);
}
else
returnbase.ProcessDataGridViewKey(e);
}

hozouri
چهارشنبه 07 مرداد 1388, 08:56 صبح
دوست عزیز اگر یه قسمت از پروژه و بانک رو بفرستی من راحت تر و سریع تر می تونم کمکتون کنم .

ان مسائلی که گفتی در واقع مشکلاتی هست که در حین برنامه نویسی برنامه نویس به اون بر می خوره و من با ایده های خودم اون رو بر طرف کردم.

مثلاً در مورد دو بار اینتر زدن برای ایجاد سطر باید عرض کنم که من یه Sendkey فرستادم تا یه بار دیگه اینتر به طور اتوماتیک زده بشه در صورتی که شرط های درج سطر بعد تماماً درست باشه.

من برای هر سطرم یه چک کننده گذاشتم نه برای کل گرید چون بعضی مواقع کاربر میاد یه 3 تا سطر رو به طور کامل و درست ایجاد می کنه اما سطر 1 رو میره تغییر میده و اطلاعات رو جوری وارد می کنه که دیگه اشتباه است حال با این کار موقع ثبت کردن اگر در هر سطر 1 ردیف CheckRow برای درستی اطلاعات داشته باشیم لازمه که فقط مقدار اون سلول ها رو در هر سطر بخونیم که اگر ture بودن (البته همه سطر ها)اطلاعات ثبت بشه که اگر هم نب.دند پیغام خطا میده. این طور که من گفتم موقع ثبت کردن زمان کمی می بره. ولی ...
اگر شما موقع ثبت کردن بخواهید یکی یکی اطلاعات رو برای درستی یا نادرستی چک کنید در اسناد بزرگ که اطلاعات اون ها بیش از چند صد رکود است سیستم خیلی کند عمل می کنه ...

من نمی دونم چقدر تونستم جواب گوی سوالات شما باشم و چه قدر برای پاسخگویی به شما کمک کرده باشم.

من خوشحال میشم اگه بتونم به شما کمکی در این رابطه کرده باشم ...

sima1984
چهارشنبه 07 مرداد 1388, 10:01 صبح
من از هر دو دوست محترم به خاطر کمکهاشون ممنونم
مشکل من در مورد چک کردن یک سلول همچنان وجود داره من این کارهارو انجام دادم
در مورد چک کردن یک سلول:
من تنها در هر سطر 1 یا 2 سلول رو لازم دارم که چک کنم تا اگر مجاز نبودن enter از رو ی اونها جلو نره من از کد زیر استفاده کردم ولی فکر میکنم به دلیل اینکه تا زمانی که سلول مورد نظر برای چک کردن سلول جاریه مقدارش رو null در نظر میگیره بنابراین این کد برای من قابل استفاده نیست



protectedoverridebool ProcessDataGridViewKey(KeyEventArgs e)
{
.
.
.
.
foreach (string c in celldate)
{
if (base.CurrentCell.ColumnIndex.ToString() == c && base.CurrentCell.Value != null)
{
string mon = base.CurrentCell.Value.ToString().Substring(5, 2);
string day = base.CurrentCell.Value.ToString().Substring(8, 2);
if (Int32.Parse(mon) > 12 || Int32.Parse(day) > 31 || Int32.Parse(day) > 30 && Int32.Parse(mon) > 6)
{
datefail=
true;
}






}
}
if (datefail) returnfalse;
else
returnthis.ProcessTabKey(e.KeyData);

}

else
returnbase.ProcessDataGridViewKey(e);
}


من اول چک میکنم که اگه سلول ،سلول خاص برای چک کردن است یعنی یک سلول از نوع date است مقدار انرا چک کرده و اگر مجاز نبود datefail ,true میشود حالا اگر datefail true باشد اینتر نباید از روی ان رد شود در صورتی که این اتفاق نمی افتد چون تا زمانی که اینتر از روی سلول رد نشود مقدار ان را null میگیرد