تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] حل مشكلة متعلقه ب BackgroundWorker
#1
السلام عليكم 

اخواني انا استخدم هذا الكود لاضافة بيانات لل listview

كود :
 Private Sub BackgroundWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
       



            Try
                Dim conn As New SqlConnection("Data Source = " & SQLS & ";  User ID = " & UR & "; Password = " & Pass & ";database=" & DN & ";")
                conn.Open()
                Dim dt As New DataTable
                Dim ds As New DataSet

                ds.Tables.Add(dt)
                Dim da As New SqlDataAdapter("SELECT * FROM Vinfo", conn)
            ' da.Fill(ds, "Yazan")
                da.Fill(dt)





                Con_Status(True)
                conn.Close()
                Dim myrow As DataRow


                For Each myrow In dt.Rows
                    If myrow.Item(0) = Vlist.Items(0).Text Then
                    Else


                        Vlist.Items.Add(myrow.Item(0))
                        Vlist.Items(Vlist.Items.Count - 1).SubItems.Add(myrow.Item(1))
                        Vlist.Items(Vlist.Items.Count - 1).SubItems.Add(myrow.Item(2))
                        Vlist.Items(Vlist.Items.Count - 1).SubItems.Add(myrow.Item(3))
                        Vlist.Items(Vlist.Items.Count - 1).SubItems.Add(myrow.Item(4))
                    End If
                Next
            Catch ex As SqlClient.SqlException
                If ex.Message = "Invalid object name 'Vinfo'." Then
                    Con_Status(True)

                Else
                    Con_Status(False)
                    MessageBox.Show(ex.Message, "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error)
                End If



            End Try

    End Sub


ولكن يعطيني خطأ :
Cross-thread operation not valid: Control 'Vlist' accessed from a thread other than the thread it was created on.





اعلم ان الخطأ بسبب Cross-thread operation

ولكن ليس عندي خبره بها ... ارجوا المساعدة وشكراا
الرد }}}
تم الشكر بواسطة:
#2
ارجوا الحل ... وشكرا
الرد }}}
تم الشكر بواسطة:
#3
PHP كود :
Private Sub ShowDataInLvw(ByVal data As DataTableByVal lvw As ListView)
 
   lvw.View View.Details
    lvw
.GridLines True
    lvw
.Columns.Clear()
 
   lvw.Items.Clear()
 
   For Each col As DataColumn In data.Columns
        lvw
.Columns.Add(col.ToString)
 
   Next
    For Each row 
As DataRow In data.Rows
        Dim lst 
As ListViewItem
        lst 
lvw.Items.Add(If(row(0IsNot Nothingrow(0).ToString""))
 
       For i As Integer 1 To data.Columns.Count 1
            lst
.SubItems.Add(If(row(iIsNot Nothingrow(i).ToString""))
 
       Next
    Next
End Sub     
وتستدعيه هكذا

PHP كود :
ShowDataInLvw(dt,Listview1

موفق
سبحان الله والحمدلله ولا إله إلا الله والله أكبر
 اللهم اغْفِرْ لِلمؤمنين والمؤمنات والمسلمين والمسلمات الأحياء منهم والأموات
الرد }}}
تم الشكر بواسطة:
#4
اخي اعطاني هذا الخطأ
Cross-thread operation not valid: Control 'Vlist' accessed from a thread other than the thread it was created on.

انا استخدم backgroundworker

اخي الخطأ في كودي يلي انا كتبته هنا :
الصوره في المرفقات


ما الحل ؟؟


الملفات المرفقة صورة/صور
   
الرد }}}
تم الشكر بواسطة:
#5
ارجوا انك قد فهمت ما اقصده
الرد }}}
تم الشكر بواسطة:
#6
تأكد من صحة عمل هذا عندك
Dim conn As New SqlConnection("Data Source = " & SQLS & "; User ID = " & UR & "; Password = " & Pass & ";database=" & DN & ";")
سبحان الله والحمدلله ولا إله إلا الله والله أكبر
 اللهم اغْفِرْ لِلمؤمنين والمؤمنات والمسلمين والمسلمات الأحياء منهم والأموات
الرد }}}
تم الشكر بواسطة:
#7
اخي الكود صحيح ويشتغل دون backgroundworker
الرد }}}
تم الشكر بواسطة:
#8
معذرة
انت محق
وأرجو اني فهمتك الان فعلا
https://msdn.microsoft.com/en-us/library...cs-lang=vb
سبحان الله والحمدلله ولا إله إلا الله والله أكبر
 اللهم اغْفِرْ لِلمؤمنين والمؤمنات والمسلمين والمسلمات الأحياء منهم والأموات
الرد }}}
تم الشكر بواسطة: الطالب
#9
سلام


جرب تضع هذا التعديل
كود :
Dim connString As String = "Data Source = " & SQLS & ";  User ID = " & UR & "; Password = " & Pass & ";database=" & DN & ";"

Private Sub BackgroundWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
   Try
       Using da As New SqlDataAdapter("SELECT * FROM Vinfo", connString)
           Using dt As New DataTable
               da.Fill(dt)
               SetDataSource(dt)
           End Using
       End Using
   Catch ex As SqlClient.SqlException
       MessageBox.Show(ex.Message, "Error !", MessageBoxButtons.OK, MessageBoxIcon.Error)
   End Try
End Sub

Delegate Sub SetDataTable(ByVal dt As DataTable)
Private Sub SetDataSource(ByVal dt As DataTable)
   If Vlist.InvokeRequired Then
       Dim d As New SetDataTable(AddressOf SetDataSource)
       Invoke(d, New Object() {dt})
   Else
       For Each row As DataRow In dt.Rows
           Vlist.Items.Add(New ListViewItem(New String() {row(0), row(1), row(2), row(3), row(4)}))
       Next
   End If
End Sub

لكن انصحك بدل الارقام التي في السطر التالي تضع اسماء الحقول مثل
كود :
Vlist.Items.Add(New ListViewItem(New String() {row("col1"), row("col2"), row("col3"), row("col4"), row("col5")}))

الكود مجرب


موفقين
متغيب
الرد }}}
تم الشكر بواسطة:
#10
شكرا لك اخي Lion_KSA
وشكرا لك اخي الطالب ... تم الحل عن طريق كود اخي الطالب شكراااا لكم جميعااا
الرد }}}
تم الشكر بواسطة:



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


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