PDA

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



swallow.pa
سه شنبه 01 فروردین 1391, 21:11 عصر
با سلام خدمت همه
این سوالی رو که می پرسم ماهیتا با این تایپیک http://barnamenevis.org/showthread.php?333208-%D8%B3%D9%84%DA%A9%D8%AA-%DA%A9%D8%B1%D8%AF%D9%86-%DB%8C%DA%A9-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF-%D9%85%D9%88%D8%B1%D8%AF-%D9%86%D8%B8%D8%B1-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%DA%AF%D8%B1%DB%8C%D8%AF
فرق می کنه
توی گرید من حدود هزار تا رکورد هست می خوام کاربر جستجوهاش رو توی گرید انجام بده و نتایج رو همون لحظه سلکت کنه بدون اینکه رکوردها فیلتر بشن
راهش چیه
ممنون از لطفاتون

فرید نجفلو
چهارشنبه 02 فروردین 1391, 01:05 صبح
یعنی اگه نوشتی فرید و تو ستون اسم کوچک هر کدوم فرید بود به حالت انتخاب دربیان؟
مثلا اگه سطرهای 1و4و201 اسم فرید بود این سه ستون به حالت انتخاب در بیان و بقیه نه؟
نوع فیلتر رو هم بگید ، حالت دقیق(فقط اسم هایی که فرید هستن) یا حالت مشابه (اسم هایی که حاوی فرید هستن مثل:فرید،فریدون،فریده و ....)!

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

moslem68
چهارشنبه 02 فروردین 1391, 01:22 صبح
"Select * From Table1 Where Id Like 'N %" + TextBox1.Text + "N %' And Name Like 'N %" + TextBox2.Text + " N%' And Family Like 'N %" + TextBox3.Text + "N %'"

فرید نجفلو
چهارشنبه 02 فروردین 1391, 01:35 صبح
"Select * From Table1 Where Id Like 'N %" + TextBox1.Text + "N %' And Name Like 'N %" + TextBox2.Text + " N%' And Family Like 'N %" + TextBox3.Text + "N %'"


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

------------------------------------------

swallow.pa
چهارشنبه 02 فروردین 1391, 12:14 عصر
ببینید دوستان اطلاعات توی گرید با یک سلکت پر می شه
SELECT * FROM Table1
خب حالا به دیتاست و .....
وقتی دیتاگرید پرشد و رکوردها توش هست حالا می خوایم از توی این رکوردها جستجو انجام بدیم
شما چیکار می کنید؟
ممنون

saeidpsl
چهارشنبه 02 فروردین 1391, 13:18 عصر
بفرما

Dim i, a AsInteger
For i = 1 To DataGridView1.Rows.Count - 1
For a = 1 To DataGridView1.Columns.Count - 2
If TextBox1.Text = DataGridView1.Rows(i).Cells(a).Value Then
DataGridView1.Rows(i).Cells(a).Selected = True
EndIf
Next
Next

morrning
چهارشنبه 02 فروردین 1391, 13:20 عصر
"Select * From Table1 Where Id Like 'N %" + TextBox1.Text + "N %' And Name Like 'N %" + TextBox2.Text + " N%' And Family Like 'N %" + TextBox3.Text + "N %'"

فکر کنم این کد مشکل امنیتی داره کافیه یوزر یه علامت ' وارد کنه و بعد دستور SQL مورد نظرش رو وارد کنه .مطمئن نیستم ولی احتمالا sql injection به وجود بیاد چون ورودی فیلتر نشده!

swallow.pa
چهارشنبه 02 فروردین 1391, 13:39 عصر
بفرما

Dim i, a AsInteger
For i = 1 To DataGridView1.Rows.Count - 1
For a = 1 To DataGridView1.Columns.Count - 2
If TextBox1.Text = DataGridView1.Rows(i).Cells(a).Value Then
DataGridView1.Rows(i).Cells(a).Selected = True
EndIf
Next
Next

دوست من از لطف شما ممنونم
حالا توی توابع sql دیدی که عملگر Like داریم اینجا چطوری عمل کنیم
ممنونم

saeidpsl
چهارشنبه 02 فروردین 1391, 14:29 عصر
:چشمک:خواهش
جستجوی like به شکل حرف حرف یا دونه دونه یا len len چک میکنه پس باید پس اینجوری میشه

مثل این


Dim p, o As Integer
Dim db As String
db = DataGridView1.Rows(i).Cells(a).Value
For p = 1 To Len(db)
For o = 1 To Len(TextBox1.Text)
If Mid(TextBox1.Text, o, o) = Mid(DataGridView1.Rows(i).Cells(a).Value.ToString, p, p) Then
DataGridView1.Rows(i).Cells(a).Selected = True
End If
Next
Next

swallow.pa
چهارشنبه 02 فروردین 1391, 14:53 عصر
Sub Find_In_Grid()
Dim db As String
Dim I As Integer
db = DataGridViewX1.Rows(I).Cells(5).Value
For p = 1 To Len(db)
For o = 1 To Len(txtFind.Text)
If Mid(txtFind.Text, p, p) = Mid(DataGridViewX1.Rows(I).Cells(5).Value.ToString , p, p) Then
DataGridViewX1.Rows(I).Cells(5).Selected = True
End If
Next
Next
End Sub

دوست من این کد رو استفاده کردم کار نکرد
نمی دونم عیبش چیه

فرید نجفلو
چهارشنبه 02 فروردین 1391, 15:55 عصر
دوست عزیز شما به جای MID باید از InStr استفاده کنید هم راحته هم حلقه داخلی حذف می شه!
ون از همه مهمتر اینکه من اصلا متوجه نشدم این تابع شما دنبال چی می گرده
ولی اینو می دونم که اگه یک حرف از سلول گرید با یک حرف از منت تکست باکس مشابه باشن سلول انتخاب میشه (مثلا abcd و dcba باه برابرند!!!)

Sub Find_In_Grid(SearchFor As String)
For Each aRow In DataGridViewX1.Rows
If InStr(aRow.Cells(5).ToString, SearchFor) <> 0 Then
aRow.Cells(5).Selected = True
End If
Next
End Sub

swallow.pa
چهارشنبه 02 فروردین 1391, 16:13 عصر
دوست عزیز شما به جای MID باید از InStr استفاده کنید هم راحته هم حلقه داخلی حذف می شه!
ون از همه مهمتر اینکه من اصلا متوجه نشدم این تابع شما دنبال چی می گرده
ولی اینو می دونم که اگه یک حرف از سلول گرید با یک حرف از منت تکست باکس مشابه باشن سلول انتخاب میشه (مثلا abcd و dcba باه برابرند!!!)

Sub Find_In_Grid(SearchFor As String)
For Each aRow In DataGridViewX1.Rows
If InStr(aRows(I).Cells(5).ToString, SearchFor) <> 0 Then
Rows(I).Cells(5).Selected = True
End If
Next
End Sub
این کد اینجا خطا می دهد
Error 1 'aRows' is not declared. It may be inaccessible due to its protection level.

فرید نجفلو
چهارشنبه 02 فروردین 1391, 16:43 عصر
برادر من این کد رو بدن تست همینجا نوشتم و یکs(I) اضافه نوشتم(البته بیشتر واسه اینه که از کد شما رو اصلاح کردم) حالا نمی شد اونو خودت پاک کنی؟!!
بعضی وقتا یه چیزایی می پرسید و می نوسید که آدم می ره تو کما!
(اصلاح شد)

swallow.pa
چهارشنبه 02 فروردین 1391, 18:37 عصر
من این کد رو بدن تست همینجا نوشتم و یکs(I) اضافه نوشتم(البته بیشتر واسه اینه که از کد شما رو اصلاح کردم) حالا نمی شد اونو خودت پاک کنی؟!!

)
با سلام
آدم چیزی رو که بلد نباشه باید بگه من تو این قسمت هنگ کردم و این کدها هم تست کردم جواب نداد

saeidpsl
چهارشنبه 02 فروردین 1391, 19:31 عصر
درست شد


Dim p, o As Integer
Dim db As String
db = DataGridView1.Rows(i).Cells(a).Value
For p = 1 To Len(db)
For o = 1 To Len(TextBox1.Text)
If Mid(TextBox1.Text, o, 1) = Mid(DataGridView1.Rows(i).Cells(a).Value.ToString, p, 1) Then
DataGridView1.Rows(i).Cells(a).Selected = True
End If
Next
Next

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

این کد یک یک چک میکنه خودت میتونی بزاری دوتا دوتا len

::چشمک::

swallow.pa
چهارشنبه 02 فروردین 1391, 21:44 عصر
این قسمت اشکال داره
db = DataGridViewX1.Rows(i).Cells(a).Value
اون چیزی رو که الان سلکت شده بر می گردونه در صورتی که اون رکوردی رو که می خوایم شاید توی ردیف 50 دیتاگرید باشه

ali_najari
چهارشنبه 02 فروردین 1391, 22:29 عصر
دوست عزیز آیا به دیتاگیرید تون Datasource میدید؟ اگر یک Datatable رو به دیتا سورس بدهید خیلی راحت و بدون صرف وقت زیر 1 میلی ثانیه میشه بین 10000 و بیشتر اطلاعات رو فیلتر کرد!

اگر امکانش هست تعیین کنید که آیا اطلاعات رو از بانک اطلاعاتی وارد دیتاگیرید میکنید؟ و در وحله دوم اگر امکانش هست یک نمونه برنامه بزارید از پرکردن دیتاگیرید تا مشکل رو حل کنم

ROSTAM2
چهارشنبه 02 فروردین 1391, 22:32 عصر
با سلام
یه پیشنهاد دارم...
یه تابع درون TableAdapter جدول بساز به این مضمون
SELECT * FROM Table1 WHERE Name Like '%' + @Name + '%' And Family Like '%' + @Family + '%'
اگه اسم این تابع بشه FillByNameAndFamily
از این تابع در برنامه بدین نحو استفاده می کنیم
MYTableAdapder1.FillByNameAndFamily(MYDataSet1.Tab le1,NameBox.Text,FamilyBox.Text)
اگر DataGrid به منبع اطلاعات وصل باشه اتوماتیک آیتمهای فیلتر شده نمایش داده می شه در غیر اینصورت ، برای نمایش تمامی آیتمهای جدول با همین فیلتر
With MYDataSet1.Table1
For i=0 to .Count -1
X=.Item(i).Name
Next
End With
به جای X خانه های DataGrid رو وارد کنید

moslem68
سه شنبه 12 اردیبهشت 1391, 00:34 صبح
"Select * From Table1 Where Id Like 'N %" + TextBox1.Text + "N %' And Name Like 'N %" + TextBox2.Text + " N%' And Family Like 'N %" + TextBox3.Text + "N %'"

فکر کنم این کد مشکل امنیتی داره کافیه یوزر یه علامت ' وارد کنه و بعد دستور SQL مورد نظرش رو وارد کنه .مطمئن نیستم ولی احتمالا sql injection به وجود بیاد چون ورودی فیلتر نشده!

TextBox1.Text.Replace("'", "''")
با این کد مشکل امنیتش حل نمیشه ?

فرید نجفلو
سه شنبه 12 اردیبهشت 1391, 13:58 عصر
دوست عزیز درسته این SQL Injection هست و فوق العاده خطرناک اگه مصمم هستید که از این خطر دور بشید باید از دستورات پارامتریک استفاده کنید
یه بررسی تو سایت داشته باشید پیدا می کنید
اون روشی هم که گفتید بدرد نمی خوره!

کاظم فلاحی خواه
سه شنبه 12 اردیبهشت 1391, 19:45 عصر
سلام دوست عزیز پروژت آماده شد .
مطمئنا باگ داره به علت کم بود وقت می سپارمش به دوستان عزیز (Farid-VbBoss , ...)

86569


86570

فرید نجفلو
چهارشنبه 13 اردیبهشت 1391, 13:20 عصر
سلام دوست عزیز پروژت آماده شد .
مطمئنا باگ داره به علت کم بود وقت می سپارمش به دوستان عزیز (Farid-VbBoss , ...)


سلام
بله خواهش می کنم!
اگه جسارت نباشه :
شما در کدتون از For Each استفاده کردید و داخل همون اومدیدی از یه شمارنده (intcount و intcountCell) استفاده کردید
کد نویسی اضافی و تورفتگی غیر لازم دیده می شه
کد شما اگه دقت کرده باشید سلول های خلی رو هم انتخاب می کنه

بنده هم این کد رو پیشنهاد می کنم (چون نخواستم یه پروژه جدید بفرستم جهت تست کد ها رو تو همون پروژه دوستمون با کد های موجود تعویض کنید):

Private Sub FindInGridColumn(SearchFor As String, ColumnName As Integer, Optional WholeWord As Boolean = True)
For Each aRow As DataGridViewRow In Me.DataGridView1.Rows
If WholeWord Then
If CStr(aRow.Cells(ColumnName).Value) = SearchFor Then
aRow.Cells(ColumnName).Selected = True
End If
Else
If InStr(CStr(aRow.Cells(ColumnName).Value), SearchFor, CompareMethod.Text) <> 0 Then
aRow.Cells(ColumnName).Selected = True
End If
End If
Next
End Sub
Private Sub FindAllInGrid(SearchFor As String, Optional WholeWord As Boolean = True)
For Each Clmn As DataGridViewColumn In Me.DataGridView1.Columns
FindInGridColumn(SearchFor, Clmn.Index, WholeWord)
Next
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
DataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect
DataGridView1.ClearSelection()
FindAllInGrid(TextBox1.Text, RadioButton1.Checked)
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Try
DataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect
DataGridView1.ClearSelection()
Dim clmn = Me.DataGridView1.Columns(TextBox2.Text)
FindInGridColumn(TextBox3.Text, clmn.Index, RadioButton1.Checked)
Catch ex As Exception
End Try
End Sub