تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
فلتر للداتا جريد فيو
#1
عندى داتا جريد فيو تظهر بها البيانات وكل شئ تمام
المطلو ان اعمل فلتر للبيانات الى ظهرت داخلها على اساس نص يكتب داخل تكست
مثلا يظهر فى الداتا جريد
رقم الصنف و اسم الصنف و سعر الصنف
اريد عند كتابة حرف مثلا ب يتم تصفية الجريد ويظهر فقط المطابق علية البحث

المشكلة ان مش عاوز اعمل كده من الداتا
لا انا بجيب البيانات للجريد بطريقة معينة ولكن عاوز فلتر للبيانات الى ظهرت فى الجريد فقط
الرد
تم الشكر بواسطة:
#2
(30-08-20, 01:41 AM)ahmedramzyaish كتب : عندى داتا جريد فيو تظهر بها البيانات وكل شئ تمام
المطلو ان اعمل فلتر للبيانات الى ظهرت داخلها على اساس نص يكتب داخل تكست
مثلا يظهر فى الداتا جريد
رقم الصنف  و اسم الصنف و سعر الصنف
اريد عند كتابة حرف مثلا ب يتم تصفية الجريد ويظهر فقط المطابق علية البحث

المشكلة ان مش عاوز اعمل كده من الداتا
لا انا بجيب البيانات للجريد بطريقة معينة ولكن عاوز فلتر للبيانات الى ظهرت فى الجريد فقط

استخدم فلتر ال BindingSource الخاص بالجدول

هذا مثال
كود :
Me.tableBindingSource.Filter = " [column] LIKE '" & TextBox1.Text & "%'"
الرد
#3
(30-08-20, 02:06 AM)عيد مبارك كتب :
(30-08-20, 01:41 AM)ahmedramzyaish كتب : عندى داتا جريد فيو تظهر بها البيانات وكل شئ تمام
المطلو ان اعمل فلتر للبيانات الى ظهرت داخلها على اساس نص يكتب داخل تكست
مثلا يظهر فى الداتا جريد
رقم الصنف  و اسم الصنف و سعر الصنف
اريد عند كتابة حرف مثلا ب يتم تصفية الجريد ويظهر فقط المطابق علية البحث

المشكلة ان مش عاوز اعمل كده من الداتا
لا انا بجيب البيانات للجريد بطريقة معينة ولكن عاوز فلتر للبيانات الى ظهرت فى الجريد فقط

استخدم فلتر ال BindingSource الخاص بالجدول

هذا مثال
كود :
Me.tableBindingSource.Filter = " [column] LIKE '" & TextBox1.Text & "%'"

شكراا
اين يوضع الكود
ومعنى
tableBindingSource
الرد
تم الشكر بواسطة: ابراهيم ايبو , ابراهيم ايبو
#4
كما اخبرك الاخ فوقي ، الخاصية 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
الرد
#5
(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

يظهر معى خطأ
الرد
تم الشكر بواسطة:
#6
(31-08-20, 12:42 AM)ahmedramzyaish كتب : يظهر معى خطأ

ما نوع الخطأ ؟ صورة او انسخ رسالة الخطأ كيف لي ان اعرف مالمشكلة اخي الكريم ؟
الرد
#7
(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:


الملفات المرفقة صورة/صور
   
الرد
تم الشكر بواسطة: ابراهيم ايبو , ابراهيم ايبو
#8
اخي الكريم كيف تقوم بملىء الداتا جريد فيو ؟
هذه الطريقة تعمل فقط عندما تقوم بملىء الجريد فيو باستخدام 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

اذا اردت مشاركة مثال من مشروعك في الجزء الخاص بمليء الجريد فيو لكي نتمكن من معرفة ما المشكلة
الرد
تم الشكر بواسطة: WaeLx , WaeLx , ابراهيم ايبو , ابراهيم ايبو
#9
(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
الرد
تم الشكر بواسطة: ابراهيم ايبو
#10
اخي الكريم انصحك ان تغير طريقة اضافة البيانات للداتا جريد مباشرة عن طريق 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
الرد



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم