PDA

View Full Version : حرفه ای: چطوري ميشه توي DataGridView يه قسمت از متن فيلد رو رنگي كرد؟



ali_najari
یک شنبه 17 مرداد 1389, 18:34 عصر
سلام

من يه ديتاگيريد دارم كه فيلترش ميكنم حالا ميخوام اون قسمتي از متني كه كاربر وارد كرده . بر اساس اون فيلتر شده رو رنگي كنم

چطوري ميشه اينكار رو انجام داد؟

ricky22
یک شنبه 17 مرداد 1389, 19:29 عصر
سلول مورد نظر را به textbox تبدیل(cast) کن.




Dim cell As DataGridViewCell = Me.DataGridView1(1, 1)

If Not cell.IsInEditMode Then
Me.DataGridView1.CurrentCell = cell
Me.DataGridView1.BeginEdit(False)
End If

Dim control As TextBox = DirectCast(Me.DataGridView1.EditingControl, TextBox)

control.SelectionStart = 0
control.SelectionLength = 3

ali_najari
دوشنبه 18 مرداد 1389, 08:58 صبح
اين كد كه فقط Select ميكنه رنگ اون قسمت رو تغيير نميده كه

من ميخوام فقط رنگ اون قسمت كه همسان هست رو قرمز كنه و بقيه نوشته مشكي باشه

ali_najari
سه شنبه 19 مرداد 1389, 08:39 صبح
كسي نميدونه چطوري بايد اين كار و كرد؟

بايد از كلاس هاي گرافيكي انجام داد يا اينكه راه ديگه اي هست

FastCode
سه شنبه 19 مرداد 1389, 09:31 صبح
من راهش رو میدونم ولی نوشتنش با خودته.
باید اول event ه DataGridViewCellPainting رو بگیری.
بعد توش یه شرط بنویسی که سلولی که در حال رسمه اون خاصیت رو داره؟
بعد با measurestring بخش اول که سیاه هست رو اندازه بگیری و رسمش کنی.
بخش دوم رو هم با measurestring اندازه میگیری.
بعد بدون فاصله بخش دوم که قرمزه رو بعد از اون رورسم کنی.
بعد بخش سوم رو بعد از بخش دوم رسم میکنی.

چند نکته نباید فراموش بشه:
۱.حروف فارسی چند حالت نمیدونم اول و آخر و وسط چسبیده و نچسبیده و یه طرف چسبیده و .... دارن.
۲.overlap رو باید با توجه به نیازت هندل بکنی که باید بشه یا نه؟
۳.نوشته نباید از کادر بیرون بزنه و یا اگر زد بخش بعدی رو دیگه رنگ نکنی.
۴.اول باید background رو رسم کنی.
۵.باید e.Handled رو true کنی.
اگر نوشتی و جواب داد کدش رو بزار اینجا تا بررسی کنیم.چون معمولاً با یه test case درست یا غلط بودن این کد معلوم نمیشه و دوم اینکه میخوام کدت رو ببینم.

Mehdi6052
سه شنبه 19 مرداد 1389, 10:37 صبح
اين كد كه فقط Select ميكنه رنگ اون قسمت رو تغيير نميده كه


دوست عزیز مثل اینکه با برنامه نویسی زیاد آشنایی ندارید، چرا که با سرنخی که آقای ricky22 (http://www.barnamenevis.org/forum/member.php?u=44714) دادند خودتان با کمی تغییرات می توانید به همان روش رنگ سلول خاص دیتاگرید را تغییر دهید.
برای مثال کد زیر را استفاده نمائید:



Dim cell As DataGridViewCell = dGrid(1, 1)
If Not cell.IsInEditMode Then
dGrid.CurrentCell = cell
dGrid.BeginEdit(False)
End If
Dim control As TextBox = DirectCast(dGrid.EditingControl, TextBox)
'control.SelectionStart = 0
'control.SelectionLength = 3
control.ForeColor = Color.Red


با این تکه کد رنگ متن سلول مورد نظر به رنگ قرمز درمی آید.
توجه: dGrid یک دیتاگرید است.

Mani_rf
سه شنبه 19 مرداد 1389, 11:35 صبح
دوست عزیز مثل اینکه با برنامه نویسی زیاد آشنایی ندارید، چرا که با سرنخی که آقای ricky22 (http://www.barnamenevis.org/forum/member.php?u=44714) دادند خودتان با کمی تغییرات می توانید به همان روش رنگ سلول خاص دیتاگرید را تغییر دهید.
برای مثال کد زیر را استفاده نمائید:



Dim cell As DataGridViewCell = dGrid(1, 1)
If Not cell.IsInEditMode Then
dGrid.CurrentCell = cell
dGrid.BeginEdit(False)
End If
Dim control As TextBox = DirectCast(dGrid.EditingControl, TextBox)
'control.SelectionStart = 0
'control.SelectionLength = 3
control.ForeColor = Color.Red


با این تکه کد رنگ متن سلول مورد نظر به رنگ قرمز درمی آید.
توجه: dGrid یک دیتاگرید است.

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

احمدی
مرادی
احمدزاده
وثوق احمدی
آقااحمدی

برای مثال کاربر به دنبال کلمه "احمد" گشت ، به این شکل نمایش داده بشه :

احمدی
مرادی
احمدزاده
وثوق احمدی
آقااحمدی

نه اینکه رنگ نوشته کل سلول عوض بشه یا اینکه سلول یا قسمتی از سلول انتخاب بشه.



من راهش رو میدونم ولی نوشتنش با خودته.
باید اول event ه DataGridViewCellPainting رو بگیری.
بعد توش یه شرط بنویسی که سلولی که در حال رسمه اون خاصیت رو داره؟
بعد با measurestring بخش اول که سیاه هست رو اندازه بگیری و رسمش کنی.
بخش دوم رو هم با measurestring اندازه میگیری.
بعد بدون فاصله بخش دوم که قرمزه رو بعد از اون رورسم کنی.
بعد بخش سوم رو بعد از بخش دوم رسم میکنی.

چند نکته نباید فراموش بشه:
۱.حروف فارسی چند حالت نمیدونم اول و آخر و وسط چسبیده و نچسبیده و یه طرف چسبیده و .... دارن.
۲.overlap رو باید با توجه به نیازت هندل بکنی که باید بشه یا نه؟
۳.نوشته نباید از کادر بیرون بزنه و یا اگر زد بخش بعدی رو دیگه رنگ نکنی.
۴.اول باید background رو رسم کنی.


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

به نظر من به دنبال کامپاننت دیتاگرید آماده این بگرد که این امکان را داشته باشه، دیتاگرید جانوس یا دات نت بار یا ... را امتحان کن.

ricky22
سه شنبه 19 مرداد 1389, 11:39 صبح
بابا آخه اول بخونید ببیدین این بنده خدا چی می خواد بعد راهنمایی کنید. منظور ایشون اینه که برای مثال اگر در جدولی داده های زیر را داشتیم :

احمدی
مرادی
احمدزاده
وثوق احمدی
آقااحمدی

برای مثال کاربر به دنبال کلمه "احمد" گشت ، به این شکل نمایش داده بشه :

احمدی
مرادی
احمدزاده
وثوق احمدی
آقااحمدی

نه اینکه رنگ نوشته کل سلول عوض بشه یا اینکه سلول یا قسمتی از سلول انتخاب بشه.


سلام
من منظور ایشون رو متوجه شدم.
اگر دقت کنید طبق روش بنده اگه عمل کنند
3 حرف احمد Highlight میشه فقط آبی میشه.

ali_najari
سه شنبه 19 مرداد 1389, 12:05 عصر
ممنون
منم انجام دادم ولي هنوز كامل نيست

من يكم بايد روش وقت بزارم بخاطر اينكه بتونم راست به چپش كنم

فرصت بديد كدش رو ميزارم واسه همه

ali_najari
سه شنبه 19 مرداد 1389, 12:06 عصر
البته هنوز توي كلماتي كه پيوسته هست گير دارم ولي سعي ميكنم سريع انجامش بدم

يكي دو روز مهلت بديد

Mani_rf
سه شنبه 19 مرداد 1389, 12:07 عصر
سلام
من منظور ایشون رو متوجه شدم.
اگر دقت کنید طبق روش بنده اگه عمل کنند
3 حرف احمد Highlight میشه فقط آبی میشه.

فقط یکی از آنهایی که در کل جدول وجود دارد، نه همه.

ricky22
سه شنبه 19 مرداد 1389, 12:15 عصر
فقط یکی از آنهایی که در کل جدول وجود دارد، نه همه.
خب ایشون باید همه ی سلول های حاوی کلمه مورد جستجو را به Textbox تبدیل کننید و رنگی کنند.
بنده فقط مثالی از Casting زدم.

ali_najari
سه شنبه 19 مرداد 1389, 14:21 عصر
ريكي جان به روش شما فقط Select ميكنه

منم ميخوام رنگش رو عوض كنه نه Select كنه

ali_najari
سه شنبه 19 مرداد 1389, 14:24 عصر
من راهش رو میدونم ولی نوشتنش با خودته.
باید اول event ه DataGridViewCellPainting رو بگیری.
بعد توش یه شرط بنویسی که سلولی که در حال رسمه اون خاصیت رو داره؟
بعد با measurestring بخش اول که سیاه هست رو اندازه بگیری و رسمش کنی.
بخش دوم رو هم با measurestring اندازه میگیری.
بعد بدون فاصله بخش دوم که قرمزه رو بعد از اون رورسم کنی.
بعد بخش سوم رو بعد از بخش دوم رسم میکنی.

چند نکته نباید فراموش بشه:
۱.حروف فارسی چند حالت نمیدونم اول و آخر و وسط چسبیده و نچسبیده و یه طرف چسبیده و .... دارن.
۲.overlap رو باید با توجه به نیازت هندل بکنی که باید بشه یا نه؟
۳.نوشته نباید از کادر بیرون بزنه و یا اگر زد بخش بعدی رو دیگه رنگ نکنی.
۴.اول باید background رو رسم کنی.
۵.باید e.Handled رو true کنی.
اگر نوشتی و جواب داد کدش رو بزار اینجا تا بررسی کنیم.چون معمولاً با یه test case درست یا غلط بودن این کد معلوم نمیشه و دوم اینکه میخوام کدت رو ببینم.

اين روشي كه شما پيشنهاد داديد خيلي سخت و وقت گيره تازه براي فارسي هم مشكل داريم چون محبوريم حروف رو جدا كنيم و رنكي كنيم

اينطوري توي گيريدويو نميتونيم كل خط رو Select كنيم چون ميام يه حالت عكس روي اون قسمت گيريد ايجاد ميكنيم

اين زياد با اون چيزي كه من ميخوام تطابق نداره

من اين رو آماده ميكنم تا فردا و واسه همه ميزارم
ولي اگه راه بهتري بود بگيد تا انجام بديم

ricky22
سه شنبه 19 مرداد 1389, 14:41 عصر
ريكي جان به روش شما فقط Select ميكنه

منم ميخوام رنگش رو عوض كنه نه Select كنه
http://social.msdn.microsoft.com/forums/en-US/vbgeneral/thread/43f6b81f-4cb7-4e8e-bd29-e3645f200734

ali_najari
سه شنبه 19 مرداد 1389, 16:39 عصر
عزيز من يه كدي شبيه به همين نوشتم ولي با FullRowSelect مشكل دارم و فارسي
چون در فارسي كلمات به هم چسبيده

FastCode
سه شنبه 19 مرداد 1389, 17:13 عصر
اين روشي كه شما پيشنهاد داديد خيلي سخت و وقت گيره تازه براي فارسي هم مشكل داريم چون محبوريم حروف رو جدا كنيم و رنكي كنيم

اينطوري توي گيريدويو نميتونيم كل خط رو Select كنيم چون ميام يه حالت عكس روي اون قسمت گيريد ايجاد ميكنيم

اين زياد با اون چيزي كه من ميخوام تطابق نداره

من اين رو آماده ميكنم تا فردا و واسه همه ميزارم
ولي اگه راه بهتري بود بگيد تا انجام بديم

با select کردن هیچ مشکلی نداره حتما" یه جایی اشتباه کردید.
من خودم این کار رو کردم.(ولی اصلا" اون منطقی رو که شما میخوای نداره.اگر داشت که آپلود میکردم)

ali_najari
سه شنبه 19 مرداد 1389, 23:34 عصر
اون تيكه كدت رو واسم ميزاري؟

FastCode
چهارشنبه 20 مرداد 1389, 02:30 صبح
void grid_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch();
sw1.Start();
U_Grid g = this.U_Grid;
DataGridViewCellStyle CS = e.CellStyle;
bool Selected = (e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected;
if (e.RowIndex != -1)
{
//1, 2, 3, 4 == Back, Fore, Selected Back , Selected Fore
Tuple<Color?, Color?, Color?, Color?> Colors;
Color BC = Color.Empty, FC = Color.Empty;
int i = 0;
foreach (Func<long, int?, Tuple<Color?, Color?, Color?, Color?>> CP in colorTable)
{
if (i == 2) break;
Colors = CP(e.RowIndex, e.ColumnIndex);
if (Colors != null)
{
if (Selected)
{
if (Colors.Item3 != null) { i++; BC = Colors.Item3.Value; }
if (Colors.Item4 != null) { i++; FC = Colors.Item4.Value; }
}
else
{
if (Colors.Item1 != null) { i++; BC = Colors.Item1.Value; }
if (Colors.Item2 != null) { i++; FC = Colors.Item2.Value; }
}
}
}
//this line needs a genius to understand, but the logic is the same as the numbers.
if (i == 1)
{
if (Selected)
{
if (BC == Color.Empty) BC = U_Color._Get(g.Cell_BackColor_Selected);
if (FC == Color.Empty) FC = U_Color._Get(g.Cell_ForeColor_Selected);
}
else
{
if (BC == Color.Empty) BC = g._Get_BackColor(e.RowIndex, e.ColumnIndex);
if (FC == Color.Empty) FC = g._Get_ForeColor(e.RowIndex, e.ColumnIndex);
}
if (e.CellStyle.BackColor != BC) e.CellStyle.BackColor = BC;
if (e.CellStyle.ForeColor != FC) e.CellStyle.ForeColor = FC;
e.Paint(e.CellBounds, e.PaintParts);
e.Handled = true;
sw1.Stop();
Console.WriteLine(sw1.ElapsedMilliseconds);
return;
}
else
{
if (Selected)
{
CS.BackColor = U_Color._Get(g.Cell_BackColor_Selected);
CS.ForeColor = U_Color._Get(g.Cell_ForeColor_Selected);
}
else
{
CS.BackColor = g._Get_BackColor(e.RowIndex, e.ColumnIndex);
CS.ForeColor = g._Get_ForeColor(e.RowIndex, e.ColumnIndex);
}
e.Paint(e.CellBounds, e.PaintParts);
e.Handled = true;
sw1.Stop();
Console.WriteLine(sw1.ElapsedMilliseconds);
return;
}
}
else
{
CS.BackColor = g._Get_Header_BackColor(e.ColumnIndex);
CS.ForeColor = g._Get_Header_ForeColor(e.ColumnIndex);
e.Paint(e.CellBounds, e.PaintParts);
e.Handled = true;
sw1.Stop();
Console.WriteLine(sw1.ElapsedMilliseconds);
return;
}
}
کاری که میکنه اینه که تمام متن رو رنگ میکنه.
نمیدونم درست کار میکنه یا نه.ولی اگر درست کار نکرد یه پیام خصوصی بده.

ali_najari
پنج شنبه 21 مرداد 1389, 09:46 صبح
هركاري ميكنم باز اوني نيست كه من مد نظرم هست

كسي نميتونه كمك كنه
من يه پروژه ديدم با دلفي كه اين امكان رو داشت

FastCode
جمعه 22 مرداد 1389, 18:30 عصر
هركاري ميكنم باز اوني نيست كه من مد نظرم هست

كسي نميتونه كمك كنه
من يه پروژه ديدم با دلفي كه اين امكان رو داشت
اگر فایل exe رو داشته باشی میتونی decompile کنی.
اگر سازندش بهت اجازه بده.(یه جوری که منم بفهمم)
منم میتونم این کار رو برات بکنم.

ali_najari
دوشنبه 25 مرداد 1389, 11:30 صبح
كسي راهي پيدا نكرد؟

ali_najari
شنبه 13 شهریور 1389, 09:33 صبح
سلام من يه راهي پيدا كردم اما اگه كسي ميتونه اين رو تكميل تر كنه خيلي ممنون ميشم

ali_najari
سه شنبه 20 مهر 1389, 17:00 عصر
دوستان كسي اصلا اين برنامه رو ديد؟

كسي نتونست راه بهتري پيدا كنه؟