نمایش نتایج 1 تا 4 از 4

نام تاپیک: بروز رسانی فرم از داخل یک کلاس

  1. #1
    کاربر دائمی آواتار ali_najari
    تاریخ عضویت
    مهر 1386
    محل زندگی
    اصفهان
    سن
    36
    پست
    849

    بروز رسانی فرم از داخل یک کلاس

    با سلام و خسته نباشید

    دوستان من یک کلاس دارم که مربوط به زمانی هست که دیتابیسم بروز میشه!

    Imports Microsoft.SqlServer.Management.Smo
    Public Class DatabaseWatcher
    Private Shared WatcherServer As Server
    Private Shared Sub Table_Changed(ByVal sender As Object, ByVal e As ServerEventArgs)
    For Each prpty In e.Properties
    If prpty.Value = "IN_Letter_Tmp_For_Event" Then
    'Do Here!
    MsgBox("اطلاعات جدول تغییر کرد!")
    End If
    Next
    End Sub
    Public Shared Sub RegisterEvent()
    WatcherServer = New Server("IT-PC")
    WatcherServer.ConnectionContext.AutoDisconnectMode = False
    Dim db As Database
    db = WatcherServer.Databases("Indicator")
    Dim databaseCreateEventSet As New DatabaseEventSet
    databaseCreateEventSet.DropTable = True
    Dim serverCreateEventHandler As ServerEventHandler
    serverCreateEventHandler = New ServerEventHandler(AddressOf Table_Changed)
    db.Events.SubscribeToEvents(databaseCreateEventSet , serverCreateEventHandler)
    db.Events.StartEvents()
    End Sub
    End Class



    حال میخوام زمانی که کلاسم بروز شد بجای نمایش پیغام میخوام مثلا فرم 1 رو واسم دیتاگیریدش رو بروز کنه!
    واسه این کار باید چیکار کنم؟

  2. #2
    کاربر دائمی آواتار فرید نجفلو
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    تبریز
    پست
    1,189

    نقل قول: بروز رسانی فرم از داخل یک کلاس

    دوست عزیز بهترین راه استفاده ار رویداد است:

    کد تغییر یافته کلاس:
    Imports Microsoft.SqlServer.Management.Smo
    Public Class DatabaseWatcher
    Private Shared WatcherServer As Server
    Private Shared db As Database
    Public Shared Event TableChanged As EventHandler(Of EventArgs)
    Private Shared Sub Table_Changed(ByVal sender As Object, ByVal e As ServerEventArgs)
    For Each prpty In e.Properties
    'If prpty.Value = "TBL_Tmp_For_Event" Then
    If prpty.Value = "IN_Letter_Tmp_For_Event" Then
    'Do Here!
    ' MsgBox("اطلاعات جدول تغيير کرد!")
    RaiseEvent TableChanged(prpty.Value, New EventArgs)
    End If
    Next
    End Sub
    Public Shared Sub RegisterEvent()
    Try
    WatcherServer = New Server("ALI-PC\ASQLSERVER")

    WatcherServer.ConnectionContext.AutoDisconnectMode = False
    db = WatcherServer.Databases("Indicator")
    Dim databaseCreateEventSet As New DatabaseEventSet
    databaseCreateEventSet.DropTable = True
    Dim serverCreateEventHandler As ServerEventHandler
    serverCreateEventHandler = New ServerEventHandler(AddressOf Table_Changed)
    db.Events.SubscribeToEvents(databaseCreateEventSet , serverCreateEventHandler)
    db.Events.StartEvents()
    Catch ex As Exception
    MsgBox("SMO ERROR : " & vbNewLine & ex.Message)
    My.Computer.Clipboard.SetText(ex.Message)
    End Try
    End Sub
    End Class


    یک فرم نمونه که از کلاس استفاده می کند:

    Imports System.Data.SqlClient
    Imports System.Data
    Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    DoAsycEventraise()
    RefreshGrid()
    End Sub
    ''' <summary>
    ''' چون وقتی متد موجود در کلاس صدا زده می شود تا رویداد پایگاه داده ارسال شود فرم باید
    ''' مدتی منتظر بماند تا رویداد ریجستر شود و برنامه تاخیر در اجرا دارد
    ''' برای همین این متد در یک نخ جدا اجرا می شود
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DoAsycEventraise()
    Try
    CheckForIllegalCrossThreadCalls = False
    AddHandler DatabaseWatcher.TableChanged, AddressOf SQLEvent_Handler
    Dim t As New Threading.Thread(AddressOf DatabaseWatcher.RegisterEvent)
    t.SetApartmentState(Threading.ApartmentState.MTA)
    t.Start()
    Catch ex As Exception
    End Try
    End Sub
    Private Sub SQLEvent_Handler(sender As System.Object, e As System.EventArgs)
    RefreshGrid()
    End Sub
    Private Sub RefreshGrid()
    Try
    Application.DoEvents()
    Dim TSQL As String = "Select * From IN_Letter"
    Using Conn As New SqlConnection("Data Source=ALI-PC\ASQLSERVER;Initial Catalog=Indicator;Integrated Security=True")
    Dim adp As New SqlDataAdapter(TSQL, Conn)
    Dim res As New DataTable
    adp.Fill(res)
    adp.Dispose()
    Conn.Dispose()
    If res IsNot Nothing Then Me.DataGridView1.DataSource = res
    End Using
    Catch ex As Exception
    End Try
    End Sub

    End Class

  3. #3
    کاربر دائمی آواتار ali_najari
    تاریخ عضویت
    مهر 1386
    محل زندگی
    اصفهان
    سن
    36
    پست
    849

    نقل قول: بروز رسانی فرم از داخل یک کلاس

    نقل قول نوشته شده توسط Farid.N مشاهده تاپیک
    دوست عزیز بهترین راه استفاده ار رویداد است:

    کد تغییر یافته کلاس:
    Imports Microsoft.SqlServer.Management.Smo
    Public Class DatabaseWatcher
    Private Shared WatcherServer As Server
    Private Shared db As Database
    Public Shared Event TableChanged As EventHandler(Of EventArgs)
    Private Shared Sub Table_Changed(ByVal sender As Object, ByVal e As ServerEventArgs)
    For Each prpty In e.Properties
    'If prpty.Value = "TBL_Tmp_For_Event" Then
    If prpty.Value = "IN_Letter_Tmp_For_Event" Then
    'Do Here!
    ' MsgBox("اطلاعات جدول تغيير کرد!")
    RaiseEvent TableChanged(prpty.Value, New EventArgs)
    End If
    Next
    End Sub
    Public Shared Sub RegisterEvent()
    Try
    WatcherServer = New Server("ALI-PC\ASQLSERVER")

    WatcherServer.ConnectionContext.AutoDisconnectMode = False
    db = WatcherServer.Databases("Indicator")
    Dim databaseCreateEventSet As New DatabaseEventSet
    databaseCreateEventSet.DropTable = True
    Dim serverCreateEventHandler As ServerEventHandler
    serverCreateEventHandler = New ServerEventHandler(AddressOf Table_Changed)
    db.Events.SubscribeToEvents(databaseCreateEventSet , serverCreateEventHandler)
    db.Events.StartEvents()
    Catch ex As Exception
    MsgBox("SMO ERROR : " & vbNewLine & ex.Message)
    My.Computer.Clipboard.SetText(ex.Message)
    End Try
    End Sub
    End Class


    یک فرم نمونه که از کلاس استفاده می کند:

    Imports System.Data.SqlClient
    Imports System.Data
    Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    DoAsycEventraise()
    RefreshGrid()
    End Sub
    ''' <summary>
    ''' چون وقتی متد موجود در کلاس صدا زده می شود تا رویداد پایگاه داده ارسال شود فرم باید
    ''' مدتی منتظر بماند تا رویداد ریجستر شود و برنامه تاخیر در اجرا دارد
    ''' برای همین این متد در یک نخ جدا اجرا می شود
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DoAsycEventraise()
    Try
    CheckForIllegalCrossThreadCalls = False
    AddHandler DatabaseWatcher.TableChanged, AddressOf SQLEvent_Handler
    Dim t As New Threading.Thread(AddressOf DatabaseWatcher.RegisterEvent)
    t.SetApartmentState(Threading.ApartmentState.MTA)
    t.Start()
    Catch ex As Exception
    End Try
    End Sub
    Private Sub SQLEvent_Handler(sender As System.Object, e As System.EventArgs)
    RefreshGrid()
    End Sub
    Private Sub RefreshGrid()
    Try
    Application.DoEvents()
    Dim TSQL As String = "Select * From IN_Letter"
    Using Conn As New SqlConnection("Data Source=ALI-PC\ASQLSERVER;Initial Catalog=Indicator;Integrated Security=True")
    Dim adp As New SqlDataAdapter(TSQL, Conn)
    Dim res As New DataTable
    adp.Fill(res)
    adp.Dispose()
    Conn.Dispose()
    If res IsNot Nothing Then Me.DataGridView1.DataSource = res
    End Using
    Catch ex As Exception
    End Try
    End Sub

    End Class
    دوست عزیز من این رو تست کردم ولی زمانی که اطلاعات دیتاگیرید رو به روز میکنه بلافاصله فرم هنگ میکنه

  4. #4
    کاربر دائمی
    تاریخ عضویت
    مهر 1387
    محل زندگی
    تهران
    پست
    260

    نقل قول: بروز رسانی فرم از داخل یک کلاس

    منم همین مشکل و دارم و فرمم هنگ میکنه و برنامه end now میشه

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •