PDA

View Full Version : سوال: فیلتر گذاری روی سلول های دیتا گرید



system32
شنبه 23 خرداد 1388, 19:05 عصر
چگونه می توان برای سلول های یک دیتا گرید فیلتر گذاشت. مثلا می خواهم برای ستون مربوط به شماره تلفن فقط سلول های این ستون عدد را قبول کنند و رشته را قبول نکنند.

NewFoxStudent
شنبه 23 خرداد 1388, 19:10 عصر
اگه موقع طراحی میخوای این کار رو بکنی توی پنجره پروپرتیز گزینه DefultCellStyle رو پیدا کن و دکمه جلوش رو بزن و Format رو تغییر بده
برای زمان اجرا هم میتونی از این استفاده کنی

dataGridView1.Columns[0].DefaultCellStyle.Format = "#########";

system32
شنبه 23 خرداد 1388, 19:22 عصر
میشه بیشتر توضیح بدین. کدو وارد کردم جواب نداد. من می خواهم وقتی سلول در حالت ویرایش قرار گرفت فقط عدد را قبول کنه نه چیز دیگه ای. و چیزی دیگه اینکه می خام اگه عدد نبود پیغامی نمایش بده. یا حداقل اصلا چیزی بغیر از عدد رو اجازه ورود بهش نده. ممنون

NewFoxStudent
شنبه 23 خرداد 1388, 19:46 عصر
ببخشید دوست عزیز کدی بالا نوشتم برای کار دیگه ای
از این کد استفاده کنید
این کد رو توی رویداد CellValueChanged بنویسید


int num=0;
if (e.ColumnIndex == 0)
if (!int.TryParse(dataGridView1[e.RowIndex, e.ColumnIndex].Value, out num))
{
MessageBox.Show("مقدار وارد شده صحیح نمیباشد");
dataGridView1[e.ColumnIndex, e.RowIndex].Value = null;
}



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

system32
شنبه 23 خرداد 1388, 20:13 عصر
یه سری خطا از جمله خارج از اندیکس بودن و تبدیل به رشته داشت او نا رو درست کردم اما بازم چه رشته و چه عدد وارد می کنم بازم می گه مقدار وارد شده صحیح نمی باشد.




int num = 0;
if (e.ColumnIndex == 0)
if (!int.TryParse(dataGridView1[e.RowIndex+1, e.ColumnIndex+1].Value.ToString(), out num))
{
MessageBox.Show("êç§ں© يں©§ ¬§ى ­¥ی¥ ëêی ں¬§");
dataGridView1[e.ColumnIndex+1, e.RowIndex+1].Value = null;
}



چه تغییر باید در آن بدهم؟

NewFoxStudent
شنبه 23 خرداد 1388, 20:37 عصر
خطای Index Out Of Rang به خاطر اینه که گرید شما موقع اجرا هیچ ردیفی نداره
این کد رو دیگه خودم تست کردم جواب هم داد



private void dataGridView2_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
int num = 0;
if (e.ColumnIndex != 0 || e.RowIndex < 0 || dataGridView2[e.RowIndex, e.ColumnIndex].Value == null)
return;
if (!int.TryParse(dataGridView2[e.RowIndex, e.ColumnIndex].Value.ToString(), out num))
{
MessageBox.Show("Test");
dataGridView2[e.RowIndex, e.ColumnIndex].Value = null;
return;
}
}

system32
شنبه 23 خرداد 1388, 20:47 عصر
این کد فقط روی سلول اول کار می کنه و به بقیه جواب نمی ده. و در ضمن هی پیغام خطا رو تکرار می کنه. یکم بهش ور رفتم و بالاخره کدش رو نوشتم گفتم بزارم دوستان هم استفاده کنند. از NewFoxStudent نیز خیلی ممنونم که مرا در این زمینه کمک کرد.




int num = 0;
if (e.ColumnIndex == 0)
if (!int.TryParse(dataGridView1[0,e.RowIndex].Value.ToString(), out num) & dataGridView1[0,e.RowIndex].Value.ToString() != string.Empty)
{

MessageBox.Show("ˆ‡§ں© ïں©§ ¬§î ­¥ی¥ ‰ˆی ں¬§");
dataGridView1[0, e.RowIndex].Value = null;
}

system32
شنبه 23 خرداد 1388, 21:02 عصر
یادم رفت بگم تو رویداد CellEndEdit کپیش کنید. در ضمن این کد برای ستون اول.

system32
یک شنبه 24 خرداد 1388, 19:14 عصر
دوستان یه سوال دیگه؟

کدهای بالا برای وقتیه که ورودی فقط رشته یا فقط عدد باشه. ولی اگه ترکیبی از این دو تا باشه کار نمی کنه. (برای رشته ها منظورمه) چطور می توان این مشکل را حل کرد. ای کاش راهی بودن که هنگام فشار دادن دکمه صفحه کلید عدد یا حرف وارد نمی شد ولی رویدادی با نام CellKeyPress نداره. لطفا راهنمایی کنید.

seven7777777
دوشنبه 25 خرداد 1388, 02:55 صبح
ببین مگه چند حالت میتونه رخ بده ، قائدتا 3 حالت :

1. عدد وارد کنه .
2. حرف وارد کنه .
3. هر دو رو وارد کنه .

خوب کافیه شما توی رویداد CellEndEdit چک کنی دیگه . اینم با یه Try-Catch ساده امکان پذیره . تو بخش Try سعی کن با همون تابع Int.Parse تبدیل به عددش کنی ، اگه شد که هیچی اما اگه نشد تو بخش Catch یا خطا بده و یا مقدار وارد شده رو پاک کن .
البته برای تشخیص عدد بودنش راه های بهتری هم هست ولی این یه راه ساده و دم دستیه .

system32
دوشنبه 25 خرداد 1388, 10:22 صبح
دوست من ببین من همون کاری که شما گفتید انجام دادم ولی بازم وقتی عدد و رشته را با هم وارد می کنم هیچ پیغامی نمی ده که بگه فقط حرف وارد کن نه عدد. چه کارش کنم؟:متفکر:




if (int.TryParse(dataGridView1[0, e.RowIndex].Value.ToString(), out num) & dataGridView1[0, e.RowIndex].Value.ToString() != string.Empty)
{
MessageBox.Show("éلهں ©¬¢ى يں©§ کëی§");
dataGridView1[0, e.RowIndex].Value = null;
}

system32
دوشنبه 25 خرداد 1388, 12:43 عصر
دوستان خبری نشد.

NewFoxStudent
دوشنبه 25 خرداد 1388, 12:47 عصر
باید بعد از ورود اطلاعات به سلول دیگه ای بری یا کلید Enter یا Tab رو بزنی تا کد اجرا بشه

system32
دوشنبه 25 خرداد 1388, 13:01 عصر
سلام.

دوست من اینو می دونم. سوال من اینه:

با کدهای بالا می توان عدد یا غیر عدد بودن عبارت را تشخیص داد. ولی همه می دانیم که رشته شامل عدد و حرف است. اگر بگویم چک کن ببین عدد است می گوید نیست و این در حالی است که رشته من چند تا عدد هم توش داره. چطور می تونم بهش بگم اگه این رشته عدد داشت بازم اجازه ثبت بهش نده.

seven7777777
دوشنبه 25 خرداد 1388, 13:08 عصر
دوست خوبم از یکی از توابع int.Parse و Convert.ToInt32 هم استفاده کن ببین چطور میشه انشاالله که حل میشه .

NewFoxStudent
دوشنبه 25 خرداد 1388, 13:14 عصر
اگر بگویم چک کن ببین عدد است می گوید نیست و این در حالی است که رشته من چند تا عدد هم توش داره. چطور می تونم بهش بگم اگه این رشته عدد داشت بازم اجازه ثبت بهش نده.

درحالی که رشته شما چندتا عدد هم داخلش داره بازهم کد بالا اجازه ثبت نمیده و این همون چیزیه که شما میخواهید دیگه

system32
دوشنبه 25 خرداد 1388, 13:21 عصر
دوستان اینطوری نمیشه من یه چیزی می گم و شما یه چیز دیگه. خواهش می کنم تقاضا می کنم اول تست کنید بعد بگید. والا من تستش کردم هزار بارم تست کردم نشد که نشد شما هم اگه باور ندارید تست کنید.

system32
دوشنبه 25 خرداد 1388, 17:45 عصر
دوستان شاید من کمی بد سوالم را مطرح کردم. من دیگر نمی خواهم در سلول های ستونم عدد وارد بشه و می خواهم رشته ای وارد بشه که هیچ عددی در اون به کار برده نشده باشه. چطور می تونم کاری کنم که فقط رشته های بدون عدد پذیرفته بشند؟:متفکر:

NewFoxStudent
دوشنبه 25 خرداد 1388, 19:04 عصر
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
int num=0;
if (e.ColumnIndex == myIndex)
foreach (char ch in dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString())
if (int.TryParse(ch.ToString, out num))
{
MessageBox.Show("مقدار وارد شده صحیح نیست");
dataGridView1[e.ColumnIndex, e.RowIndex].Value = 0;
}
}

به جای MyIndex شماره ستونت رو بزار
تستش هم کردم جواب داد

system32
دوشنبه 25 خرداد 1388, 19:38 عصر
ممنون. خیلی عالی بود جواب داد. :تشویق:

یه سوالی که برام پیش اومد اینه که همه می دونند که اسم ها شامل سمبل های نشان دار مانند ستاره و دیگر چیزها نیستند چطور می تونم طوری فیلترگذاری کنم که اجازه ثبت سمبل ها و فاصله و چیزهای غیرمجاز دیگه رو نده. در ضمن چکار می توان کرد که پیغام خطا یکبار تکرار بشه. ممنون می شم اگه کمکم کنید.

system32
دوشنبه 25 خرداد 1388, 21:40 عصر
یه سوالی که برام پیش اومد اینه که همه می دونند که اسم ها شامل سمبل های نشان دار مانند ستاره و دیگر چیزها نیستند چطور می تونم طوری فیلترگذاری کنم که اجازه ثبت سمبل ها و فاصله و چیزهای غیرمجاز دیگه رو نده. در ضمن چکار می توان کرد که پیغام خطا یکبار تکرار بشه. ممنون می شم اگه کمکم کنید. دوستان منتظرم. اینم کلی تشویق برای کسی که این مورد را بتونه حل کنه.

:تشویق::تشویق::تشویق::تشویق:: شویق::تشویق::تشویق::تشویق::ت ویق::تشویق::تشویق::تشویق::تش یق::تشویق::تشویق::تشویق::تشو ق::تشویق::تشویق::تشویق::تشوی ::تشویق::تشویق::تشویق::تشویق: :تشویق::تشویق:

NewFoxStudent
دوشنبه 25 خرداد 1388, 22:20 عصر
دوست عزیز
همون کدی رو که گذاشتم تغییرش بدید تا به نتیجه دلخواهتون برسید
مسئله خیلی سادست
یه کارکتر هست که میخواید برابر با بعضی از کاراکترها نباشه توی همون حلقه چک کنید و اگر برابر با کارکتر خاصی بود پیغام بدید

NewFoxStudent
دوشنبه 25 خرداد 1388, 22:23 عصر
string testStr = "!@#$%^&*()_-+=}{[]~`?/.,><|:;\\";
int num=0;
if (e.ColumnIndex == 0)
foreach (char ch in dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString())
if(testStr.Contains(ch))
{
MessageBox.Show("مقدار وارد شده صحیح نیست");
dataGridView1[e.ColumnIndex, e.RowIndex].Value = 0;
}

system32
دوشنبه 25 خرداد 1388, 22:27 عصر
دوست عزیز کد بالا واقعا عالیه. فقط اگه بخوام تک تک برای * و + و غیره چک کنم برنامه از شکل حرفه ای و استاندارد خودش خارج می شه. یه راهی وجود داره و اون استفاده از کد Char.IsSymbol است و کدهای مشابه توی این کلاس ولی نمی دونم چطور ازش استفاده کنم. می تونید با این کلاس مرا راهنمایی کنید.

NewFoxStudent
دوشنبه 25 خرداد 1388, 22:45 عصر
توی همون حلقه میتونید به جای اون if از این استفاده کنید


if(char.IsSymbol(ch))

در هر حال باید رشته رو توی یک حلقه کنترل کنید

Mohsen229266
چهارشنبه 27 خرداد 1388, 22:06 عصر
با سلام، دوست عزیز این کد رو تست کردم جواب میده


static bool IsNumeric(object Expression)
{
bool isNum;
double retNum;
isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInf o, out retNum);
return isNum;
}


private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
string CurentRowIndex = dataGridView1.CurrentRow.Index.ToString();
if (e.RowIndex == int.Parse(CurentRowIndex) && e.ColumnIndex == MyColumnIndex)//شماره ستون را وارد کن MyColumnIndex بجای
{
if (dataGridView1[e.ColumnIndex, e.RowIndex].Value != null)
{
string str = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
if (!IsNumeric(str))
{
MessageBox.Show("مقدار بی اعتبار است");
dataGridView1[e.ColumnIndex, e.RowIndex].Value = 0;
}
}
}
}