PDA

View Full Version : جستجو توی دیتاگرید



mah.yar
شنبه 23 دی 1385, 15:40 عصر
چه جوری میشه توی رکودهای دیتا گرید سرچ کنیم:
به طوریکه اگه کاربر حرف الف را تایپ کرد تمام رکورهایی که اولشان الف دارد نمایش داده بشه و به همین ترتیب اگر حروف "اس" را تایپ کرد رکوردهایی نمایش داده بشه که اولشون با حروف "اس" شروع میشه.
اگه میشه با VB.NET

vahidiran
شنبه 23 دی 1385, 16:39 عصر
راهش اینه که DataSet خودتو باDataGrid لینک کنی
بعد دستور sql رو که dataset رو پر می کنه طوری بنویسی که در هر لحظه که کاربر محتویات متن جستجوش رو تغییر داد این دستور sql اجرا شه و DataSet رو پر کنه وچون این دوتا لینک هستند ، نتیجه ای که می خواهی به دست می اد از بابت سرعت هم نگران نباش من مثال عملی این برنامه رو کار کردم و عالی کار می کنه
در ضمن برای دستور sql ات باید از LIKE با پارامتر % استفاده کنی امیدوارم متوجه شده باشی

mah.yar
شنبه 23 دی 1385, 21:44 عصر
وحید جان خیلی خیلی متشکرم از جوابت :لبخندساده:
دستورالعملی که گفتی انجام دادم و درست کار میکنه اما من میخوام یه جستجوی سریع مثل اون چیزی که توی مرورگر فایر فاکس هست بسازم.
فرض کنیم جدولی داریم که یه فیلد نام توشه .با این فرض اگه تایپ کردم "ف" رکوردهایی که اول نامشون حرف "ف" داره نمایش داده بشه و به همین ترتیب اگه نوشتم "فب" رکوردهایی که اولشون "فب" داره نمایش داده بشن و ...
البته همچین چیزی رو من توی یه برنامه دلفی دیده بودم .
اگه میشه دستور SQL مربوطه رو توی تاپیک بذارید.

ali_kolahdoozan
شنبه 23 دی 1385, 23:02 عصر
خوب الان با همین روش هم همینطوره اگر می خواهی فقط اولش باشه و طوی کل رشته نره پیدا کنه % رو جابجا کن

ghafoori
شنبه 23 دی 1385, 23:33 عصر
دوست عزیز باید از دیتاویو یا از bindingsource استفاده کنی البته دومی فقط در 2005 است بعد خصوصیت filter ان را مقدار بدی مقدار ان هم همان کوئری بعد از like است یعنی این خصوصیت کار Like را انجام می دهد بعد جدول را به این کنترل بایند کنید این روش بسیار سریع تر است

ali_kolahdoozan
شنبه 23 دی 1385, 23:42 عصر
همون اولی عالی است کمتر از bindingsource برنامه رو سنگین میکنه ولی با اون هم میشه

Sub Zero
شنبه 23 دی 1385, 23:49 عصر
پیشنهاد من اینه که یه TextBox بزاری تا کاربر عبارت مورد نظرش رو توی اون بنویسه
بعد توی رویداد TextChanged مربوط به TextBox کدت رو بنویسی
در این صورت هر وقت یک حرف رو وارد کردی عملیات جستجو انجام میشه .

ali_kolahdoozan
شنبه 23 دی 1385, 23:54 عصر
اینطوری اگر کاربر مثلا دستش اشتباهی خرد روی space‌میره سرچ میکنه

Sub Zero
یک شنبه 24 دی 1385, 00:11 صبح
اینطوری اگر کاربر مثلا دستش اشتباهی خرد روی space‌میره سرچ میکنه
اینم راه داره
کافیه مقدار قبلی TextBox یه جا ذخیره بشه و قبل از هر جستجو با مقدار فعلی مقایسه بشه اگه برابر بود عمل جستجو انجام نشه مثال :


dim temp as string
private sub Textbox1_textchanged(......)
if ( trim (temp) = trim( sender.text) ) then Exit Sub
else
temp=sender.text
جستجو را انجام بده
end if

end sub

در ضمن تا اونجایی که من اطلاع دارم تمام کنترلهایی که خاصیت AuotComplate براشون درست میشه از همین روش استفاده می کنن .

ali_kolahdoozan
یک شنبه 24 دی 1385, 00:29 صبح
شدنش که میشه . اگر کدنویسی درست و حسابی بکنی هر کاری شدنی است . مهم منطق جستجو بود که فکر کنم سوال کننده رو قانع کرده

mah.yar
یک شنبه 24 دی 1385, 19:21 عصر
من با استفاده از دستورا ت زیر فقط تونستم یه مقدار ثابت رو تعریف کنم یعنی همون جوری که تو دستورات زیر میبینید فقط کلماتی ظاهر میشه که من کنار Like تعریف کردم.
من چه جوری باید یه متغیر براش تعریف کنم و مقدار اون متغیر را به مقدار Textbox پاس بدم.


Dim con As New leDbConnection("provider=microsoft.jet.oledb.4.0;datasource=mahyar .mdb")


Dim oledbda As New OleDbDataAdapter("select * from t1 where Name Like 'ali%' ", con)

Dim dataset As New DataSet

oledbda.Fill(dataset, "t1")
DataGrid1.DataSource = dataset.Tables("t1")


اگه ممکنه دستور کاملشو بنویسید:متفکر:

Sub Zero
دوشنبه 25 دی 1385, 11:47 صبح
کد زیر رو امتحان کن شاید جواب بده :

Dim con As New leDbConnection("provider=microsoft.jet.oledb.4.0;d atasource=mahyar.mdb")
dim sqlcmd as string="select * from t1 where Name Like '" & textbox1.text & "%'"
Dim oledbda As New OleDbDataAdapter(sqlcmd, con)
Dim dataset As New DataSet
oledbda.Fill(dataset, "t1")
DataGrid1.DataSource = dataset.Tables("t1")
این علامت ' رو فراموش نکنی

mah.yar
دوشنبه 25 دی 1385, 12:00 عصر
آقای مصطفی رضایی دستتون درد نکنه
جواب میده و درست کار میکنه
بازم ممنون

vahidiran
جمعه 29 دی 1385, 13:00 عصر
من منظورت را متوجه نمی شم دیعنی شما می خواهید که رکورد هایی که فیلد نام آنها مقداری دارد که با یک کارکتر خاص شروع می شه نمایش داده بشه ؟ اگه این باشع همونی که من گفتم درسته

vahidiran
جمعه 29 دی 1385, 13:07 عصر
من منظورت را متوجه نمی شم دیعنی شما می خواهید که رکورد هایی که فیلد نام آنها مقداری دارد که با یک کارکتر خاص شروع می شه نمایش داده بشه ؟ اگه این باشع همونی که من گفتم درسته ( ببخشین این مطلب توی یه پست اشتباهی رفتش)

Sub Zero
جمعه 29 دی 1385, 14:35 عصر
من منظورت را متوجه نمی شم دیعنی شما می خواهید که رکورد هایی که فیلد نام آنها مقداری دارد که با یک کارکتر خاص شروع می شه نمایش داده بشه ؟ اگه این باشع همونی که من گفتم درسته

خودتون رو ناراحت نکنید روش شما هم درسته شما توی پست شماره 2 توضیحشو دادی . من کدشو (با استفاده از TextBox ) براش نوشتم

alawiala
شنبه 30 دی 1385, 09:19 صبح
ابتدا یک dataset را به یک dataview ارتباط بده سپس جستجو بر اساس حروف
را در رویداد textchange مربوط به textbox قرار بده


Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged


Me.DataView.RowFilter = "نام فیلد LIKE " & "'" & Trim(Me.TextBox1.Text) & "%" & "'"
Me.DataGride.DataSource = DataView
Me. DataGride.Refresh()

End Sub

alawiala
شنبه 30 دی 1385, 09:21 صبح
ابتدا یک dataset را به یک dataview ارتباط بده سپس جستجو بر اساس حروف
را در رویداد textchange مربوط به textbox قرار بده


Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

Me.DataView.RowFilter = "نام فیلد LIKE " & "'" & Trim(Me. TextBox1.Text) & "%" & "'"
Me.DataGride.DataSource = DataView
Me. DataGride.Refresh()

End Sub

iman_s52
شنبه 30 دی 1385, 09:49 صبح
این یکی بهتره
چون با اون روش که هر دفعه Connection رو ببندی و باز کنی تو اطلاعات با حجم بالا خیلی وقت گیره.

saman_itc
سه شنبه 08 مرداد 1387, 05:08 صبح
اگه بخوای رو یه فیلد خاص علامت سوال و ستاره هم کار کنه مثل سرچ وینوز .باید چی کار کرد؟
اول که طول تکست باکس میگیری و علامت سوال به زیر خط تبدیل کنیم؟؟

parsavb
سه شنبه 08 مرداد 1387, 08:28 صبح
دوستان عزیز چرا این کارها رو خاصیت textchange خود سلولهای دیتا گرید انجام نمی دید
مثل این



FriendWithEvents txt_dtg AsNew DataGridViewTextBoxEditingControl
PrivateSub txt_dtg_TextChanged(ByVal sender AsObject, ByVal e As System.EventArgs) Handles txt_dtg.TextChanged
If DataGridView1.Columns(DataGridView1.CurrentCell.Co lumnIndex).Name = "cod"Then

MsgBox(

"کد را تغییر دهید")

EndIf

EndSub
PrivateSub DataGridView1_EditingControlShowing(ByVal sender AsObject, ByVal e As System.Windows.Forms.DataGridViewEditingControlSho wingEventArgs) Handles DataGridView1.EditingControlShowing
txt_dtg = e.Control
EndSub

saman_itc
سه شنبه 08 مرداد 1387, 11:58 صبح
متوجه منظور من شدید؟
من میخوام تو text box سرچ بزام که کاربر بتونه توش از علامت سوال و ستاره استفاده کنه مثل ویندوز

khz-web1
چهارشنبه 09 مرداد 1387, 03:48 صبح
من میخوام تو text box سرچ بزام که کاربر بتونه توش از علامت سوال و ستاره استفاده کنه مثل ویندوز


مگه می خوای پسوند سرچ کنید؟

saman_itc
چهارشنبه 09 مرداد 1387, 19:22 عصر
شما مگه فقط برای پسوند از * یا ؟ استفاده میکنی؟
شما میتونی ?b رو سرپ کنی که همه فایل های 2 حرفی که با b شروع میشن پیدا کنی

ALI TT
یک شنبه 20 مرداد 1387, 11:33 صبح
سلام بر همه ی دوستان :

من یه دیتا گرید دارم که اولین فیلد آن مقادیر عددی وجود دارد و می خواهم مثلا عدد 500 رو از میان این رکورد ها پیدا کنم ( یعنی بهم بگه که چندمین Index هستش ) دوستان من نمی خواهم با فیلتر کردن و یا دستورات SQL این کار رو کنم و نمی خواهم در مقدار Dataset م تغییری ایجاد بشه . فقط و فقط با دیتا گرید . میشه کمکم کنید ؟

ALI TT
یک شنبه 20 مرداد 1387, 13:54 عصر
کسی نیست مارا یاری کند

بخدا کارم خیلی لنگه .

mostafaaa
یک شنبه 20 مرداد 1387, 19:07 عصر
سلام بر همه ی دوستان :

من یه دیتا گرید دارم که اولین فیلد آن مقادیر عددی وجود دارد و می خواهم مثلا عدد 500 رو از میان این رکورد ها پیدا کنم ( یعنی بهم بگه که چندمین Index هستش ) دوستان من نمی خواهم با فیلتر کردن و یا دستورات SQL این کار رو کنم و نمی خواهم در مقدار Dataset م تغییری ایجاد بشه . فقط و فقط با دیتا گرید . میشه کمکم کنید ؟
فکر میکنم با استفاده از یک حلقه به راحتی میشه این کار رو انجام داد.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
For i As Integer = 0 To Me.DataGridView1.RowCount - 1
If Me.DataGridView1.Rows(i).Cells(0).Value = 500 Then
MessageBox.Show("Index of value is " & i, "Find")
Exit For
End If
Next
End Sub

ALI TT
یک شنبه 20 مرداد 1387, 23:04 عصر
درسته ، ولی سی پی یو رو مشغول میکنه و کمی هم طول میکشه ، مخصوصا وقتی که 100000 رکورد داشته باشی !