فلتر للداتا جريد فيو - ahmedramzyaish - 30-08-20
عندى داتا جريد فيو تظهر بها البيانات وكل شئ تمام
المطلو ان اعمل فلتر للبيانات الى ظهرت داخلها على اساس نص يكتب داخل تكست
مثلا يظهر فى الداتا جريد
رقم الصنف و اسم الصنف و سعر الصنف
اريد عند كتابة حرف مثلا ب يتم تصفية الجريد ويظهر فقط المطابق علية البحث
المشكلة ان مش عاوز اعمل كده من الداتا
لا انا بجيب البيانات للجريد بطريقة معينة ولكن عاوز فلتر للبيانات الى ظهرت فى الجريد فقط
RE: فلتر للداتا جريد فيو - عيد مبارك - 30-08-20
(30-08-20, 01:41 AM)ahmedramzyaish كتب : عندى داتا جريد فيو تظهر بها البيانات وكل شئ تمام
المطلو ان اعمل فلتر للبيانات الى ظهرت داخلها على اساس نص يكتب داخل تكست
مثلا يظهر فى الداتا جريد
رقم الصنف و اسم الصنف و سعر الصنف
اريد عند كتابة حرف مثلا ب يتم تصفية الجريد ويظهر فقط المطابق علية البحث
المشكلة ان مش عاوز اعمل كده من الداتا
لا انا بجيب البيانات للجريد بطريقة معينة ولكن عاوز فلتر للبيانات الى ظهرت فى الجريد فقط
استخدم فلتر ال BindingSource الخاص بالجدول
هذا مثال
كود :
Me.tableBindingSource.Filter = " [column] LIKE '" & TextBox1.Text & "%'"
RE: فلتر للداتا جريد فيو - ahmedramzyaish - 30-08-20
(30-08-20, 02:06 AM)عيد مبارك كتب : (30-08-20, 01:41 AM)ahmedramzyaish كتب : عندى داتا جريد فيو تظهر بها البيانات وكل شئ تمام
المطلو ان اعمل فلتر للبيانات الى ظهرت داخلها على اساس نص يكتب داخل تكست
مثلا يظهر فى الداتا جريد
رقم الصنف و اسم الصنف و سعر الصنف
اريد عند كتابة حرف مثلا ب يتم تصفية الجريد ويظهر فقط المطابق علية البحث
المشكلة ان مش عاوز اعمل كده من الداتا
لا انا بجيب البيانات للجريد بطريقة معينة ولكن عاوز فلتر للبيانات الى ظهرت فى الجريد فقط
استخدم فلتر ال BindingSource الخاص بالجدول
هذا مثال
كود :
Me.tableBindingSource.Filter = " [column] LIKE '" & TextBox1.Text & "%'"
شكراا
اين يوضع الكود
ومعنى
tableBindingSource
RE: فلتر للداتا جريد فيو - Anas Mahmoud - 30-08-20
كما اخبرك الاخ فوقي ، الخاصية RowFilter الخاصة بالداتا تيبل
في حدث TextBox1_TextChanged اكتب الكود التالي :
كود :
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Dim dt As DataTable = DataGridView1.DataSource
Dim CuloumnName As String = dt.Columns(1).ColumnName 'رقم العمود 1 العمود الثاني
Dim txt As TextBox = sender
dt.DefaultView.RowFilter = String.Format("{0} LIKE '%{1}%'", CuloumnName, txt.Text)
End Sub
او اذا كنت تعرف اسم العمود مباشرة عدل السطر :
كود :
Dim CuloumnName As String = "Name"
المصدر : https://stackoverflow.com/a/19265114/14137871
RE: فلتر للداتا جريد فيو - ahmedramzyaish - 31-08-20
(30-08-20, 09:43 AM)Anas Mahmoud كتب : كما اخبرك الاخ فوقي ، الخاصية RowFilter الخاصة بالداتا تيبل
في حدث TextBox1_TextChanged اكتب الكود التالي :
كود :
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Dim dt As DataTable = DataGridView1.DataSource
Dim CuloumnName As String = dt.Columns(1).ColumnName 'رقم العمود 1 العمود الثاني
Dim txt As TextBox = sender
dt.DefaultView.RowFilter = String.Format("{0} LIKE '%{1}%'", CuloumnName, txt.Text)
End Sub
او اذا كنت تعرف اسم العمود مباشرة عدل السطر :
كود :
Dim CuloumnName As String = "Name"
المصدر : https://stackoverflow.com/a/19265114/14137871
يظهر معى خطأ
RE: فلتر للداتا جريد فيو - Anas Mahmoud - 31-08-20
(31-08-20, 12:42 AM)ahmedramzyaish كتب : يظهر معى خطأ
ما نوع الخطأ ؟ صورة او انسخ رسالة الخطأ كيف لي ان اعرف مالمشكلة اخي الكريم ؟
RE: فلتر للداتا جريد فيو - ahmedramzyaish - 01-09-20
(31-08-20, 07:12 AM)Anas Mahmoud كتب : (31-08-20, 12:42 AM)ahmedramzyaish كتب : يظهر معى خطأ
ما نوع الخطأ ؟ صورة او انسخ رسالة الخطأ كيف لي ان اعرف مالمشكلة اخي الكريم ؟
System.NullReferenceException was unhandled
Message=Object reference not set to an instance of an object.
Source=X Accounting-JM
StackTrace:
at UnitedSoftware.frmSafeGrd.TextBox1_TextChanged(Object sender, EventArgs e) in C:\Users\ahmedramzy\Desktop\StockVB - SourceCode - RAMZI-7-3-2020\Forms\frmSafeGrd.vb:line 508
at System.Windows.Forms.Control.OnTextChanged(EventArgs e)
at System.Windows.Forms.TextBoxBase.OnTextChanged(EventArgs e)
at System.Windows.Forms.TextBoxBase.WmReflectCommand(Message& m)
at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
at System.Windows.Forms.TextBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd, Message& m)
at System.Windows.Forms.Control.WmCommand(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.GroupBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WmKeyChar(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
at System.Windows.Forms.TextBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(ApplicationContext context)
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
at UnitedSoftware.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
RE: فلتر للداتا جريد فيو - Anas Mahmoud - 01-09-20
اخي الكريم كيف تقوم بملىء الداتا جريد فيو ؟
هذه الطريقة تعمل فقط عندما تقوم بملىء الجريد فيو باستخدام DataTable باسناده للخاصية DataSource
اذا كانت DataSource للجريد فيو تساوي لا شيء فانه يظهر هذا الخطأ
ما اعنيه هل تستخدم هذه الطريقة في ملئ الجريد فيو ؟
كود :
Dim query As String = "SELECT * FROM TBL"
Dim cmd As New SqlCommand(query, con)
Dim sda As New SqlDataAdapter(cmd)
Dim dt As New DataTable
sda.Fill(dt)
DataGridView1.DataSource = dt
اذا اردت مشاركة مثال من مشروعك في الجزء الخاص بمليء الجريد فيو لكي نتمكن من معرفة ما المشكلة
RE: فلتر للداتا جريد فيو - ahmedramzyaish - 03-09-20
(01-09-20, 08:48 AM)Anas Mahmoud كتب : اخي الكريم كيف تقوم بملىء الداتا جريد فيو ؟
هذه الطريقة تعمل فقط عندما تقوم بملىء الجريد فيو باستخدام DataTable باسناده للخاصية DataSource
اذا كانت DataSource للجريد فيو تساوي لا شيء فانه يظهر هذا الخطأ
ما اعنيه هل تستخدم هذه الطريقة في ملئ الجريد فيو ؟
كود :
Dim query As String = "SELECT * FROM TBL"
Dim cmd As New SqlCommand(query, con)
Dim sda As New SqlDataAdapter(cmd)
Dim dt As New DataTable
sda.Fill(dt)
DataGridView1.DataSource = dt
اذا اردت مشاركة مثال من مشروعك في الجزء الخاص بمليء الجريد فيو لكي نتمكن من معرفة ما المشكلة
كود حساب المخزون
كود :
Private Sub CalcStock()
Try
Dim _FirstVal As Double = 0
Dim _PurchVal As Double = 0
Dim _RetPurchVal As Double = 0
Dim _SaleVal As Double = 0
Dim _RetSaleVal As Double = 0
Dim dtt As New DataTable
dtt.Columns.Add("currency")
dtt.Columns.Add("sum")
dtt.Columns.Add("type")
Dim InvSafeCond As String = ""
Dim TransfFromSafeCond As String = ""
Dim TransfToSafeCond As String = ""
If chkAll.Checked = False Then
InvSafeCond = " inv.safe=" & cmbSafes.SelectedValue & " and "
End If
Dim CondBranch As String = ""
If MainClass.BranchNo <> -1 Then
CondBranch = "branch=" & MainClass.BranchNo & " and "
End If
'مخزون أول المدة
Dim da As New SqlDataAdapter("select currency_from,sum(val) from inv,inv_sub where " & CondBranch & InvSafeCond & " inv.proc_type=3 and inv.proc_id=inv_sub.proc_id and IS_Deleted=0 group by currency_from", conn)
Dim dt As New DataTable
da.Fill(dt)
For i = 0 To dt.Rows.Count - 1
dtt.Rows.Add(dt.Rows(i)(0), Val("" & dt.Rows(i)(1)), 1)
Next
'مشتريات
da = New SqlDataAdapter("select currency_from,sum(val) from inv,inv_sub where " & CondBranch & InvSafeCond & " inv.proc_type=1 and inv_sub.proc_type=1 and inv.proc_id=inv_sub.proc_id and IS_Deleted=0 group by currency_from", conn)
dt = New DataTable
da.Fill(dt)
For i = 0 To dt.Rows.Count - 1
dtt.Rows.Add(dt.Rows(i)(0), Val("" & dt.Rows(i)(1)), 1)
Next
'مرتد مشتريات
da = New SqlDataAdapter("select currency_from,sum(val) from inv,inv_sub where " & CondBranch & InvSafeCond & " inv.proc_type=2 and inv_sub.proc_type=1 and inv.proc_id=inv_sub.proc_id and IS_Deleted=0 group by currency_from", conn)
dt = New DataTable
da.Fill(dt)
For i = 0 To dt.Rows.Count - 1
dtt.Rows.Add(dt.Rows(i)(0), Val("" & dt.Rows(i)(1)), 2)
Next
'مبيعات
da = New SqlDataAdapter("select currency_from,sum(val) from inv,inv_sub where " & CondBranch & InvSafeCond & " inv.proc_type=1 and inv_sub.proc_type=2 and inv.proc_id=inv_sub.proc_id and IS_Deleted=0 group by currency_from", conn)
dt = New DataTable
da.Fill(dt)
For i = 0 To dt.Rows.Count - 1
dtt.Rows.Add(dt.Rows(i)(0), Val("" & dt.Rows(i)(1)), 2)
Next
'مرتد مبيعات
da = New SqlDataAdapter("select currency_from,sum(val) from inv,inv_sub where " & CondBranch & InvSafeCond & " inv.proc_type=2 and inv_sub.proc_type=2 and inv.proc_id=inv_sub.proc_id and IS_Deleted=0 group by currency_from", conn)
dt = New DataTable
da.Fill(dt)
For i = 0 To dt.Rows.Count - 1
dtt.Rows.Add(dt.Rows(i)(0), Val("" & dt.Rows(i)(1)), 1)
Next
If chkAll.Checked = False Then
'محول اليه
da = New SqlDataAdapter("select currency,sum(value) from SafesTransfer,SafesTransfer_Sub where " & CondBranch & " SafesTransfer.safe_to=" & cmbSafes.SelectedValue & " and SafesTransfer.id=SafesTransfer_Sub.transfer_id and IS_Deleted=0 group by currency", conn)
dt = New DataTable
da.Fill(dt)
For i = 0 To dt.Rows.Count - 1
dtt.Rows.Add(dt.Rows(i)(0), Val("" & dt.Rows(i)(1)), 1)
Next
'محول منه
da = New SqlDataAdapter("select currency,sum(value) from SafesTransfer,SafesTransfer_Sub where " & CondBranch & " SafesTransfer.safe_from=" & cmbSafes.SelectedValue & " and SafesTransfer.id=SafesTransfer_Sub.transfer_id and IS_Deleted=0 group by currency", conn)
dt = New DataTable
da.Fill(dt)
For i = 0 To dt.Rows.Count - 1
dtt.Rows.Add(dt.Rows(i)(0), Val("" & dt.Rows(i)(1)), 2)
Next
End If
Dim _count As Integer = dtt.Rows.Count - 1
For i = 0 To _count
If i <= _count Then
If dtt.Rows(i)(2) = 2 Then
dtt.Rows(i)(1) = -Val(dtt.Rows(i)(1))
End If
End If
For j = i + 1 To _count
If j <= _count Then
If dtt.Rows(i)(0) = dtt.Rows(j)(0) Then
If dtt.Rows(j)(2) = 2 Then
dtt.Rows(j)(1) = -Val(dtt.Rows(j)(1))
End If
dtt.Rows(i)(1) = Val(dtt.Rows(i)(1)) + Val(dtt.Rows(j)(1))
dtt.Rows.RemoveAt(j)
j -= 1
_count -= 1
End If
End If
Next
Next
Dim _sum As Double = 0
Dim _sum2 As Double = 0
ProgressBar1.Value = 0
ProgressBar1.Maximum = dtt.Rows.Count
For i = 0 To dtt.Rows.Count - 1
Dim dashow As New SqlDataAdapter("select is_deleted,sale_price from currencies where id=" + dtt.Rows(i)(0), conn)
Dim dtshow As New DataTable
dashow.Fill(dtshow)
If Not Convert.ToBoolean(dtshow.Rows(0)(0)) Then
Dim _SumExchange As Double = 0
Dim _CountSum As Integer = 0
Dim _AvgExchange As Double = 0
da = New SqlDataAdapter("select sum(val),sum(val1*exchange_price) from inv,inv_sub where " & CondBranch & " currency_from=" & dtt.Rows(i)(0) & _
" and inv.proc_type=1 and inv_sub.proc_type=1 and inv.proc_id=inv_sub.proc_id and IS_Deleted=0", conn)
dt = New DataTable
da.Fill(dt)
If dt.Rows.Count > 0 And dt.Rows(0)(1).ToString <> "" Then
_SumExchange += Val(dt.Rows(0)(1))
_CountSum += Val(dt.Rows(0)(0))
End If
da = New SqlDataAdapter("select sum(val),sum(val1*exchange_price) from inv,inv_sub where " & CondBranch & " currency_from=" & dtt.Rows(i)(0) & _
" and inv.proc_type=3 and inv.proc_id=inv_sub.proc_id and IS_Deleted=0", conn)
dt = New DataTable
da.Fill(dt)
If dt.Rows.Count > 0 And dt.Rows(0)(1).ToString <> "" Then
_SumExchange += Val(dt.Rows(0)(1))
_CountSum += Val(dt.Rows(0)(0))
End If
Try
_AvgExchange = _SumExchange / _CountSum
_AvgExchange = Math.Floor(_AvgExchange * 100000000)
_AvgExchange = _AvgExchange / 100000000
dgvItems.Rows.Add()
Dim _unit As String = ""
If chkNormal.Checked Then
_unit = GetUnit(dtt.Rows(i)(0))
Else
_unit = GetUnitDefault(dtt.Rows(i)(0))
End If
Dim _perc As Double = 1
If chkDefault.Checked Then
_perc = GetUnitDefaultPerc(dtt.Rows(i)(0))
End If
dgvItems.Rows(dgvItems.Rows.Count - 1).Cells(0).Value = dtt.Rows(i)(0)
dgvItems.Rows(dgvItems.Rows.Count - 1).Cells(1).Value = GetCurrencyName(dtt.Rows(i)(0))
dgvItems.Rows(dgvItems.Rows.Count - 1).Cells(2).Value = Math.Round(Val(dtt.Rows(i)(1)) / _perc, 3)
dgvItems.Rows(dgvItems.Rows.Count - 1).Cells(3).Value = _unit
dgvItems.Rows(dgvItems.Rows.Count - 1).Cells(4).Value = String.Format("{0:0.#,##.##}", _AvgExchange)
dgvItems.Rows(dgvItems.Rows.Count - 1).Cells(5).Value = String.Format("{0:0.#,##.##}", Math.Round(_AvgExchange * Val(dtt.Rows(i)(1)), 4))
dgvItems.Rows(dgvItems.Rows.Count - 1).Cells(6).Value = String.Format("{0:0.#,##.##}", dtshow.Rows(0)("sale_price"))
dgvItems.Rows(dgvItems.Rows.Count - 1).Cells(7).Value = String.Format("{0:0.#,##.##}", Math.Round(Val(dtshow.Rows(0)("sale_price")) * Val(dtt.Rows(i)(1)), 4))
_sum += Math.Round(_AvgExchange * Val(dtt.Rows(i)(1)), 4)
_sum2 += Math.Round(Val(dtshow.Rows(0)("sale_price")) * Val(dtt.Rows(i)(1)), 4)
ProgressBar1.Value += 1
Catch ex As Exception
End Try
End If
Next
txtSum.Text = String.Format("{0:0.#,##.##}", _sum)
txtSum2.Text = String.Format("{0:0.#,##.##}", _sum2)
Catch ex As Exception
Finally
_Finished = True
End Try
End Sub
كود عرض البيانات بالجريد
كود :
Private Sub btnView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShow.Click
dgvItems.ScrollBars = ScrollBars.None
If chkAll.Checked = False And cmbSafes.SelectedIndex = -1 Then
MessageBox.Show("يجب اختيار المخزن", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
cmbSafes.Focus()
Exit Sub
End If
dgvItems.Rows.Clear()
Dim th As New System.Threading.Thread(AddressOf CalcStock)
th.Start()
End Sub
RE: فلتر للداتا جريد فيو - Anas Mahmoud - 03-09-20
اخي الكريم انصحك ان تغير طريقة اضافة البيانات للداتا جريد مباشرة عن طريق DataGridView1.Rows.Add
انصحك بملئ DataTable اولا ومن ثم جعله DataSource للداتا جريد فيو ، ذلك يتيح لك الاستفادة من الخاصية Filter الخاصة بالداتا تابل كما موضح بالمشاركات السابقة
ومع ذلك اذا لم ترد تغيير ايا من كودك يجب عليك اختبار الصفوف يدويا واظهار واخفاء ما تريد حسب محتوى التكست بوكس
الرقم 0 يمثل العمود الاول غيره الى العمود الذي تريد التغيير له
كود :
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Dim txt As TextBox = sender
For Each row As DataGridViewRow In DataGridView1.Rows
Dim cell = row.Cells(0)
If Not cell.Value Is Nothing Then
If cell.Value.ToString.Contains(txt.Text.Trim) Then
row.Visible = True
Else
row.Visible = False
End If
End If
Next
End Sub
الكود يقوم يدويا بالمرور على الصفوف واخفاء الغير مطابق للشرط وهو محتوى مربع النص
المصدر https://stackoverflow.com/a/48557623
لكي يكون الكود DRY ولا تكرر نفسك عرف الاجراء التالي عام للبرنامج كله ، في موديول مثلا
كود :
Sub Filter(Datagridview As DataGridView, index As Integer, Selector As Func(Of String, Boolean))
For Each row As DataGridViewRow In Datagridview.Rows
Dim cell = row.Cells(index)
If Not cell.Value Is Nothing Then
If Selector(cell.Value.ToString) Then
row.Visible = True
Else
row.Visible = False
End If
End If
Next
End Sub
وعند الحاجة استدعيه في سطر واحد :
كود :
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Dim txt As TextBox = sender
Filter(DataGridView1, 0, Function(x) x.Contains(txt.Text))
End Sub
تحديث هام : جربتها لعدد كبير من الصفوف وتأخذ وقت طويل جدا لذا لا انصح بها اطلاقا ، بدلا من ذلك اضف البيانات الى داتا تابل اولا وبعد ذلك اسنده الى الخاصية Datasource
|