PDA

View Full Version : یک سوال در مورد عملیات find در دیتاگرید



c#_web
پنج شنبه 23 آذر 1385, 00:51 صبح
سوال من اینست که من اطلاعات یک جدول را در دیتاگرید ریخته ام وآنها را نشان داده ام حالا میخواهم بدانم اگر به دنبال یک کلمه یا واژه بخصوصی بگردم تا ببینم این واژه در کدام سطر وجود دارد چگونه میتوانم اینکارراانجام دهم . به طوری که در هر سطری که آن واژه وجود داشت آن سطر به صورت انتخاب شده یا high light باشد . حالا برنامه نویسی آن به چه صورتی است ؟ البته آن واژه ای که من به دنبال آن میگردم به صورتی است که در پایین فرم یک تکست باکس وجود دارد و واژه موردنظر را در آن نوشته و دکمه جستجو را میزنیم حالا باید در سطرها بگردد وآن سطرهایی که این واژه ها در آن هستند را به صورت انتخاب شده نشان دهد.

Behrouz_Rad
پنج شنبه 23 آذر 1385, 23:20 عصر
کار زیباییست!
میشه متدی ایجاد کرد که به دنبال کلمه ی مورد نظر در رکوردهای Grid بگرده و در صورتی که اون رو پیدا کرد، به شکل یک فرمت دلخواه نمایش بده.
به عنوان مثال، در Firefox، اگر گزینه ی "Highlight all" رو انتخاب کنی، تمامی گزینه های مچ، با رنگ زرد، هایلایت خواهند شد.
این متد می تونه در زمان بایند داده ها به ItemTemplate ساختار TemplateField فراخونی بشه.
مشکلی که در اینجا وجود داره این هست که در یک رکورد ممکنه چندین کلمه ی مچ پیدا بشه و این کار رو کمی پیچیده می کنه!
در این حالت میشه از دلیگیت MatchEvaluator استفاده کرد.

متد ایجاد شده توسط تو شامل دو پارامتر خواهد بود. عبارت مورد جستجو و عبارتی که در آن جستجو می کنی.
کلاس Regex نیز در متد سازنده ی خود پذیرای عبارت مورد جستجو خواهد بود.
دلیگیت MatchEvaluator تنها در زمان استفاده از متد Replace کلاس Regex کاربرد خواهد داشت و با هر بار یافت شدن یک عبارت در رشته، فراخوانی می شود.
توجه داشته باش که این فراخوانی به معنای اجرای هر باره ی متد نیست! متد Regex در زمان پیدا شدن یک عبارت در یک رشته، کلاسی از نوع Match را برگشت خواهد داد که شامل اطلاعات رشته ی یافت شده است؛ و این عمل جستجو تا زمان رسیدن به پایان رشته انجام می شود.

کد توضیحات فوق:


Protected Function Highlight(ByVal searchFor As String, ByVal SearchIn As String) As String
Dim obj_Regex As New Regex(SearchFor)
Return obj_Regex.Replace(SearchIn, New MatchEvaluator(myReplaceMethod))
End Function


همون طور که میبینی، در دلیگیت MatchEvaluator، نام متدی آورده شده است. این بدان معناست که هر گاه رشته ای یافت شد، دلیگیت MatchEvaluator، متد myReplaceMethod را فراخوانی خواهد کرد.
این فراخوانی همراه با پاس دادن کلاس Match (که شامل اطلاعات رشته ی یافت شده است) به این متد خواهد بود.

پیاده سازی متد myReplaceMethod


Public Function myReplaceMethod(ByVal obj_Match As Match) As String
Return "<span class='highlight'>" + obj_Match .Value + "</span>"
End Function

مقدار برگشتی متد myReplaceMethod، یک تگ span خواهد بود که عبارت یافت شده را در بر می گیرد. میبینی که به خاصیت class تگ span، مقداری نسبت داده شده که می تونی اون رو در فایل CSS تعریف کنی. در حقیقت، عمل فرمت دهی به عبارت یافت شده را تگ span انجام خواهد داد.

نحوه ی استفاده از این تکنیک هم ساده ست!
کافیه که در ItemTemplate ساختار TemplateField، متد Highlight رو به شکل زیر فراخونی کنی:


<%# Highlight(myTextBoxValue, Eval("myField")) %>

myTextBoxValue رو یک متغیر Protected یا Public در نظر بگیر که می تونی به شکل یک Property تعریفش کنی و مقدار TextBox رو در اون قرار بدی.

موفق باشید.

c#_web
شنبه 25 آذر 1385, 00:36 صبح
ممنون از راهنمایی تون . ولی من هنوز هم حرفه ای نشده ام تا کاملا متوجه توضیحات شما شوم . مرا بیشتر راهنمایی کنید.
1)
Protected Function Highlight(ByVal searchFor As String, ByVal SearchIn As String) As String
Dim obj_Regex As New Regex(SearchFor)
Return obj_Regex.Replace(SearchIn, New MatchEvaluator(myReplaceMethod))
End Function حالا SearchIn را من چه باید بنویسم. من در داخل جمله ای خاص به دنبال آن نمیگردم بلکه در سطرهای دیتاگرید به دنبال آن میگردم .حالا به جای SearchIn چه باید بنویسم؟
2)گفته بودید : میبینی که به خاصیت class تگ span، مقداری نسبت داده شده که می تونی اون رو در فایل CSS تعریف کنی. حالا چگونه در فایل CSS اینکارراانجام دهم. لطفاً مرابیشترراهنمایی کنید.

Behrouz_Rad
شنبه 25 آذر 1385, 21:46 عصر
توضیحات بیشتری لازم نیست.
گفته ها به اندازه ی کافی گویا هستند.
لقمه را آماده کردم! جویدن را خود بیاموز....

c#_web
یک شنبه 03 دی 1385, 13:11 عصر
با تشکر از آقای راد . من برنامه ام به زبان c# است .ووقتی کدها را به آن تبدیل میکنم Match را نمیشناسد باید از چه using استفاده کنم؟؟ و در ضمن آیا باید در حلقه foreach تابع Function Highlight را صدا بزنم ؟؟ لطفاً راهنمایی کنید.

c#_web
دوشنبه 04 دی 1385, 11:01 صبح
کسی نیست مرا راهنمایی کند ؟؟
کد آقای راد را به زبان سی شارپ (c#) میخواهم ؟؟؟:متفکر: :متفکر:

Behrouz_Rad
دوشنبه 04 دی 1385, 11:59 صبح
من برنامه ام به زبان c# است .ووقتی کدها را به آن تبدیل میکنم Match را نمیشناسد باید از چه using استفاده کنم؟؟

اگر از منوی View گزینه ی Object Browser رو انتخاب کنی و به دنبال کلمه ی "Match" بگردی، نتایج جالبی(!) رو می بینی!


آیا باید در حلقه foreach تابع Function Highlight را صدا بزنم ؟؟

خیر!
به این جمله دقت کن:


دلیگیت MatchEvaluator تنها در زمان استفاده از متد Replace کلاس Regex کاربرد خواهد داشت و با هر بار یافت شدن یک عبارت در رشته، فراخوانی می شود.
توجه داشته باش که این فراخوانی به معنای اجرای هر باره ی متد نیست! متد Regex در زمان پیدا شدن یک عبارت در یک رشته، کلاسی از نوع Match را برگشت خواهد داد که شامل اطلاعات رشته ی یافت شده است؛ و این عمل جستجو تا زمان رسیدن به پایان رشته انجام می شود.

موفق باشید.

عفت بزرگه
دوشنبه 04 دی 1385, 13:19 عصر
یکم موختون را به کار بندازید آقای راد بیکار نیستها . خوب بشین کد رو بخون و تبدیل کن

c#_web
جمعه 08 دی 1385, 14:51 عصر
با تشکر از راهنمایی شما آقای راد. یک سوال دیگه هم داشتم اگر ناراحت نمیشوید؟؟!!
من در دکمه find برنامه چه باید بنویسم؟؟ برای اینکه با کلیک بر دکمه find عملیات جستجو را شروع کند من


Protected Function Highlight(ByVal searchFor As String, ByVal SearchIn As String) As String
Dim obj_Regex As New Regex(SearchFor)
Return obj_Regex.Replace(SearchIn, New MatchEvaluator(myReplaceMethod))
End Function

را در دکمه نوشتم ولی باید متغیر SearchIn را مقداری بدهم .این مقدار رامیخوام محتویات دیتاگرید باشه حالا چگونه به محتویات دیتاگرید دسترسی داشته باشم؟
لطفاً مرا راهنمایی کنید. ممنون میشم.

عفت بزرگه
جمعه 08 دی 1385, 17:09 عصر
شما یک textbox بزار روی فرم و کنارش یک کلید جستجو بزار . حالا نوشته درون textbox رو توی دیتا بیش جستجو کن اگر بود گرید رو فیلتر شده نمایش بده . همین برای جستجو هم datareader در درجه اول برای جستجو در کد بوسیله Sql ‌یا dataview برای جستجو در خود دات نت رو پیشنهاد میکنم . dataview ‌خودش rowfilter داره ولی سرعتش از datareader برای وب که کمتره . حالا اگه توی کد جستجو گیر شدی بگو با کدوم میخواهی تا برات بزارم

c#_web
دوشنبه 11 دی 1385, 23:16 عصر
من در برنامه ام تابعها را به صورت زیر نوشتم .


public string Highlight(string searchFor ,string SearchIn)
{
Regex obj_Regex =new Regex(searchFor);
return obj_Regex.Replace(SearchIn, new MatchEvaluator(myReplaceMethod));
}



public string myReplaceMethod(Match obj_Match)
{
return "<span class='highlight'>" + obj_Match .Value + "</span>";
}


و برای پر کردن دیتاگرید ، درsql یک view ساختم و اطلاعات آنرا گرفته و توسط دستورات زیر آنرا به دیتاگرید بایند کردم.


string str="select * from view1";
DataSet ds=new DataSet();
con.Open();
SqlDataAdapter da=new SqlDataAdapter(str,con);
da.Fill(ds,"tbl_kol");
con.Close();
DataGrid1.DataSource=ds.Tables["tbl_kol"];
DataGrid1.DataBind();

حالا میخوام بدونم در دکمه find چه باید بنویسم تا در گرید من همه اطلاعات آن view را نشان دهد ولی سطرهایی که متن موجود در textbox1 را دارند، آن سطرها را به صورت highlight نشان دهد؟؟؟:ناراحت: :متفکر:
البته در برنامه ام یک style sheet ایجاد کردم و در آن به صورت زیر نوشتم .


.highlight
{
background-color:Blue;
}

که نمیدانم آیا این روش برای دادن استایل درست است یا نه ؟؟ لطفاً مرا راهنمایی کنید چه کنم ؟؟

c#_web
چهارشنبه 13 دی 1385, 11:25 صبح
اگه کسی میدونه لطفاً مرا راهنمایی کنید!!:افسرده:

c#_web
پنج شنبه 14 دی 1385, 11:41 صبح
من نمیدونم!! شاید راه من درست نیست یا اینکه راهنمایی هاتون را درست انجام ندادم؟؟
ولی خواهشاً اگر راهم درست نیست یا کدهایم اشتباه است یا ... مرا راهنمایی کنید تا بتونم اشتباهاتم را برطرف و اینکار را تموم کنم.
ممنون میشم راهنمایی کنید.:ناراحت: