تقييم الموضوع :
  • 2 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
العلاقات بين الجداول-الاضافة و الحذف و التعديل-برنامج لحفظ مصادر الموقع
#7
السلام عليكم و رحمة الله و بركاته
كنا قد توقفنا عند الحصول على المرفقات و خزنا اسماء المرفقات و روابطها في جدول خاص ثم قمنا بعرض اسم المرفق
في ListBox1 تمهيدا لتحميلها حسب الرغبة
 نحن الان نمتلك رابط المرفق و اسمه , كما نملك ايضا حاوية الكوكيز و هي معبئة بالكوكيز لارسالها مع كل طلب دون ان نتعب
انفسنا بالحصول عليه مرة اخرى
كل ما تبقى هو انشاء طلب وفق رابط الملف و ارسال الكوكيز معه ثم استقبال رد الملقم و تخزين  طول الملف (حجمه) في متغير رقمي
و من ثم انشاء كائن MemoryStream للتعامل مع البيانات القادمة و بعدها كتابة هذه البيانات الى القرص الصلب و تخزينها بالاسم الذي لدينا
اقصد هنا اسم الملف المعروض في ListBox1
قبل ان ابدأ بعملية تخزين الملف ساقوم بالبحث عن الملف في مكانين
المكان الاول : هو مجلد التخزين فاذا توفر الملف فلن نحمله مرة اخرى.
المكان الثاني:قاعدة البيانات و تحديدا جدول المرفقات فكما تعلم نحن نضيف اسم الملف و مساره الى القاعدة مع كل عملية تحميل
البحث في جدول المرفقات سيتم وفق اسم الملف و رقم المقالة.
اي اننا سنبحث عن الملف المرتبط بالمقالة الحالية
كما اننا سنبحث في جدول المقالات ايضا عن المقالة الحالية المعروضة في المستعرض وفق رابط المقال
سنجري مجموعة من المقارنات لكي لا نحمل اسم مرفق لا يرتبط بالمقالة الحالية
اذ اننا سنحاول قدر الامكان تحميل المرفق المرتبط مع المقالة فقط 
بعد تحقق كل الشروط سنبدأ بتحميل الملف الى مجلد التخزين و اضافة رابط له في جدول المرفقات

في حدث زر التحميل DownloadAttachements_Click

كود :
   'زر تحميل المرفقات
   Private Sub DownloadAttachements_Click(sender As System.Object, e As System.EventArgs) Handles DownloadAttachements.Click
       Try

           If ListBox1.Items.Count > 0 Then

               'البحث عن الملف في مجلد التخزين
               Dim os As String() = System.IO.Directory.GetFiles(System.Windows.Forms.Application.StartupPath & "\AttachMents", ListBox1.Text)
               'البحث عن الملف في القاعدة
               Dim w1, w2 As Integer

               '
               Using Con

                   Dim rowinf As DataRowView
                   rowinf = InfoBindingSource.Current

                   Dim sw1 As String = "Select Count(AttachName) AS CountCn From Attaches Where  (AttachName Like '" & ListBox1.Text & "') And (Id_inf Like '" & rowinf("IdInfo") & "')  "
                   Dim sw2 As String = "Select Count(Infoname) As Cnt From Info Where UrlInfo Like '" & WebBrowser1.Url.AbsoluteUri & "'  "

                   Dim MatchCommand As New OleDbCommand(sw1, Con)
                   Dim SelCommand As New OleDbCommand(sw2, Con)

                   If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString
                   Con.Open()
                   '
                   w1 = MatchCommand.ExecuteScalar
                   w2 = SelCommand.ExecuteScalar
                   '
               End Using
               'عمليات فحص و مطابقة

               If w2 >= 1 And InfonameTextBox.Text <> WebBrowser1.DocumentTitle Then
                   Dim MsgResult As DialogResult = MessageBox.Show("المرفقات لا تتبع هذه المقالة , هناك مقالة لديك بهذا الاسم" & vbCrLf & "هل ما زلت تريد ربط المرفقات مع هذه  المقالة", "انتبه", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign)
                   If MsgResult = Windows.Forms.DialogResult.Cancel Then Exit Sub
               ElseIf w2 < 1 Then
                   MessageBox.Show("لا يوجد مقالة لديك بهذا الاسم" & vbCrLf & "قم بخزن المقالة لديك قبل تحميل المرفقات", "انتبه", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
                   Exit Sub
               End If
               '
               If w1 >= 1 Then
                   If os.Length >= 1 Then
                       MsgBox("المرفق المحدد موجود و مربوط مع المقال")
                       Exit Sub
                   Else
                       MsgBox("المسار متوفر في القاعدة بينماالمرفق غير متوفر في مجلد التخزين" & vbCrLf & "سيتم تحميل المرفق الى مجلد التخزين")
                       'هنا سنقوم بعملية تحديث تقتضي تحميل الملف فقط الى مجلد التخزين
                       If DownloadUrl(WebBrowser1.Url.AbsoluteUri) = False Then Exit Sub
                   End If
               Else
                   If os.Length >= 1 Then
                       MsgBox("الملف متوفر فقط في مجلد التخزين " & vbCrLf & "دون وجود رابط له في القاعدة" & vbCrLf & "سيتم اضافة رابط له في القاعدة")
                       'هنا سنقوم بحذف المرفق من المجلد لعدم وجود ترابط مع القاعدة
                       'Dim filePaths() As String = Directory.GetFiles(System.Windows.Forms.Application.StartupPath & "\AttachMents", ListBox1.Text)
                       'For Each filePath As String In filePaths
                       '    File.Delete(filePath)
                       'Next
                       Dim FILE_NAME As String = Application.StartupPath.ToString & "\AttachMents\" & ListBox1.Text

                       Me.Validate()
                       C = InfoBindingSource.Position
                       '
                       AttachBindingSource.AddNew()
                       '
                       D = AttachBindingSource.Position
                       '
                       Dim AttachRowview As DataRowView
                       AttachRowview = AttachBindingSource.Current
                       AttachRowview("AttachName") = ListBox1.Text
                       AttachRowview("AttachPath") = FILE_NAME
                       '
                       AttachBindingSource.EndEdit()
                       '
                       SaveData()
                       '
                       InfoBindingSource.Position = C
                       AttachBindingSource.Position = D

                   Else
                       'هنا نستخدم العملية كاملة لاضافة الملف الى القاعدة و مجلد التخزين
                       If DownloadUrl(WebBrowser1.Url.AbsoluteUri) = False Then Exit Sub
                       '
                       Me.Validate()
                       C = InfoBindingSource.Position
                       '
                       AttachBindingSource.AddNew()
                       '
                       D = AttachBindingSource.Position
                       '
                       Dim AttachRowview As DataRowView
                       AttachRowview = AttachBindingSource.Current
                       AttachRowview("AttachName") = ListBox1.Text
                       AttachRowview("AttachPath") = PathStr
                       '
                       AttachBindingSource.EndEdit()
                       '
                       SaveData()
                       '
                       InfoBindingSource.Position = C
                       AttachBindingSource.Position = D

                   End If


               End If
               '
           Else
               MsgBox("لا يوجد مرفقات او لم يتم الحصول على المرفق")
               Exit Sub
           End If

       Catch ex As Exception
           MsgBox(ex.ToString)
       End Try


   End Sub

عمليات فحص و مطابقة تستخدم اكواد بسيطة الاغلب يعرفها 
جزء منها يهتم بالتعامل مع الملفات و الجزء الاخر جمل استعلام عادية للبحث في قاعدة البيانات
كنت افضل استخدام Linq To Dataset كون البيانات متوفرة لدينا في Dataset لكنني لم استخدم استعلامات Ling
منذ بداية الموضوع لذا سنبقى على جمل Sql .
الجزء المسؤول عن التحميل هو الدالة DownloadUrl 
وهي دالة عادية تلخص الحديث السابق المختص بارسال الطلب و استقبال الرد و هي كما يلي

كود :
   ''' <summary>
   ''' اجراء تحميل المرفقات
   ''' </summary>
   ''' <param name="Url">الرابط</param>
   ''' <returns></returns>
   ''' <remarks></remarks>
   Private Function DownloadUrl(ByVal Url As String) As Boolean

       Try
           Url = ListBox1.SelectedValue.ToString
           If Url.Contains("youtube") Then
               MsgBox("لا يمكن التحميل من هذا الموقع")
               Return False
               Exit Function

           End If

           Dim DownloadRequest As HttpWebRequest = DirectCast(WebRequest.Create(Url), HttpWebRequest)

           DownloadRequest.CookieContainer = New CookieContainer()
           DownloadRequest.CookieContainer = cookies
           DownloadRequest.KeepAlive = True
           '
           Dim DownloadResponse As WebResponse = DownloadRequest.GetResponse()
           '
           Dim intLen As Integer = CInt(DownloadResponse.ContentLength)

           ProgressBar1.Maximum = intLen
           Label1.Text = "0 / " & GetFileSize2(intLen)
           System.Windows.Forms.Application.DoEvents()
           '
           If intLen < 0 Then
               MsgBox("اما ان الملف مفقود او يوجد مشكلة في الاتصال")
               DownloadResponse.Close()
               Return False
               Exit Function
           End If
           '
           Dim memStream As MemoryStream
           Using stmResponse As IO.Stream = DownloadResponse.GetResponseStream()
               Dim buffer = New Byte(intLen) {}
               Dim bytesRead As Integer
               '
               Do
                   bytesRead += stmResponse.Read(buffer, bytesRead, intLen - bytesRead)
                   ProgressBar1.Value = bytesRead

                   Label1.Text = GetFileSize2(CInt(ProgressBar1.Value.ToString())) + " / " + GetFileSize2(intLen)

                   ProgressBar1.Refresh()
                   System.Windows.Forms.Application.DoEvents()

               Loop Until bytesRead = intLen

               memStream = New MemoryStream(buffer, False)
               '
               PathStr = System.Windows.Forms.Application.StartupPath & "\AttachMents\" & ListBox1.Text
               '
               My.Computer.FileSystem.WriteAllBytes(PathStr, buffer, False)
               '
               ProgressBar1.Value = 0
               Label1.Text = "0/0"
               DownloadResponse.Close()
               memStream.Close()
           End Using
           Return True
           '====================
           'هذه الطريقة تستخدم عندما يكون رابط الملف طبيعي اي لا يحتوي على اشاراة استفهام
           '    Dim FileName As String
           'If Url.EndsWith("/") Then
           '    Url = Url.Substring(0, Url.Length - 1)
           'End If
           'FileName = Url.Substring(Url.LastIndexOf("/"c) + 1)
           'MsgBox(FileName)
           ''  Exit Function
           'PathStr = System.Windows.Forms.Application.StartupPath & "\AttachMents\" & FileName
           ''========================
           'DownloadRequest.Abort()
           'DownloadResponse.Close()
           '
       Catch ex As WebException
           If WebExceptionStatus.Timeout = WebExceptionStatus.Timeout Then
               MsgBox("لا يوجد رد من الملقم قد يكون الملف مفقود")
               Return False
               Exit Function
           Else
               MsgBox(ex.ToString)
           End If
       End Try
       Return True

   End Function

ارجع للشرح في الاعلى لتعرف سيناريو العمل
تبقى لدينا عدة مشاكل ليس المكان لعدها فقط ما واجهني منها
بعض الروابط في الموقع لا تعمل اما ان الملفات مفقودة او ان رابط التحميل لا يشير صراحة الى الملف المطلوب
فمثلا يوجد بعض الملفات في الموقع و خصوصا ملفات الرار (rar) يشير رابطها الى موقع YouTube و يقودني الى فلم اطفال (صديقتي...؟؟)
على اي حال متى ما كان رابط التحميل صحيح و الملف موجود ستكون قادر على التحميل
يحصل احيانا ان الملقم لا يرسل لك طول الملف بشكل حقيقي و هذا يؤدي الى اجهاض عملية التحميل اذ ان معرفة طول الملف الحقيقي
اساسا غير مدعومة اثناء رد الملقم
بعد تحميل المرفق الى مجلد التخزين سيتم اضافة رابط له في جدول المرفقات في القاعدة كما قلت سابقا
هناك مشكلة بسيطة قد تحدث عند نقل البرنامج من كان الى مكان و هي ان مسار الملف المخزن في القاعدة سيكون غير صحيح
لذا اعتمدت طريقة اخرى لفتح الملف تعتمد على البحث عن الملف في مجلد التخزين ستراها لاحقا عند الحديث عنها
بعد ان حملت الملف و تم ربطه مع القاعدة سيتم عرض كل المرفقات المرتبطة مع المقالة المخزنة في عنصر ListBox2 تحت المقالة
و بامكانك النقر مرتين على اي عنصر داخلها ليتم فتح المرفق و فق المسا المخزن في القاعدة او عبر اسمه 
كود الحدث كما في الاسفل
كود :
   'فتح المرفقات من الجهاز
   Private Sub ListBox2_MouseDoubleClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListBox2.MouseDoubleClick
       Try
           If ListBox2.Items.Count > 0 Then
               'البحث عن الملف في مجلد التخزين
               Dim os As String() = System.IO.Directory.GetFiles(System.Windows.Forms.Application.StartupPath & "\AttachMents\", ListBox2.Text)


               If os.Length >= 1 Then
                   Dim filePath As String = String.Empty
                   For Each filePath In os
                       If filePath <> ListBox2.SelectedValue.ToString Then
                           MsgBox("المسار المحفوظ في القاعدة مختلف عن مسار الملف" & vbCrLf & "ربما تم تغير مسار مجلد التخزين")
                           'فتح الملف وفق مسار البحث و المطابقة
                           Process.Start(filePath)
                           Exit Sub
                       End If
                   Next

                   'فتح الملف وفق مسار القاعدة
                   Process.Start(ListBox2.SelectedValue.ToString)
               Else

                   'هنا سنقوم بحذف الادخال من القاعدة القاعدة
                   Dim DeleteFile As DialogResult = MessageBox.Show("رابط الملف متوفر فقط في القاعدة,دون وجود الملف في مجلد التخزين" & vbCrLf & "هل تريد حذف الادخال من القاعدة", "انتبه", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign)
                   If DeleteFile = Windows.Forms.DialogResult.Yes Then

                       C = InfoBindingSource.Position
                       AttachBindingSource.RemoveCurrent()
                       SaveData()
                       InfoBindingSource.Position = C
                   End If

               End If

           End If

       Catch ex As Exception
           MsgBox(ex.ToString)
       End Try

   End Sub

اذا دققت في الكود السابق ستجد فيه اسطر اضافية باختصار عملها
اذا لم نجد الملف متوفر في مجلد التخزين عندها سنقوم بحذف الارتباط الموجود له في القاعدة لكي لا يشير هذا السطر الى ملف غير موجود
كذلك انا قمت بعمل دالة بسيطة تقوم باعطاء الحجم لكل الملف وفق الطريقة القياسية (KB,MB,GB,TR) اذ ليس معقولا ان تقوم بعرض حجم الملف
كارقام بل كحجوم و هو افضل
في الحقية يوجد دالتين الاولى للملفات المخزنة لدينا في القرص
و الثانية للملفات التي نريد تحميلها
الدالة الاولى 
كود :
   'هذا من اجل الملفات المخزنة في مجلد التخزين
   Public Function GetFileSize(ByVal TheFile As String) As String
       If TheFile.Length = 0 Then Return ""
       If Not System.IO.File.Exists(TheFile) Then Return ""
       '---
       Dim TheSize As ULong = My.Computer.FileSystem.GetFileInfo(TheFile).Length
       Dim SizeType As String = ""
       '---

       Try
           Select Case TheSize
               Case Is >= 1099511627776
                   DoubleBytes = CDbl(TheSize / 1099511627776) 'TB
                   Return FormatNumber(DoubleBytes, 2) & " TB"
               Case 1073741824 To 1099511627775
                   DoubleBytes = CDbl(TheSize / 1073741824) 'GB
                   Return FormatNumber(DoubleBytes, 2) & " GB"
               Case 1048576 To 1073741823
                   DoubleBytes = CDbl(TheSize / 1048576) 'MB
                   Return FormatNumber(DoubleBytes, 2) & " MB"
               Case 1024 To 1048575
                   DoubleBytes = CDbl(TheSize / 1024) 'KB
                   Return FormatNumber(DoubleBytes, 2) & " KB"
               Case 0 To 1023
                   DoubleBytes = TheSize ' bytes
                   Return FormatNumber(DoubleBytes, 2) & " bytes"
               Case Else
                   Return ""
           End Select
       Catch
           Return ""
       End Try
   End Function

الدالة الثانية
كود :
   'هذا من اجل الملفات التي يتم تحميلها
   Public Function GetFileSize2(ByVal Flength As Integer) As String
       If Flength = 0 Then Return ""
       '---
       Dim TheSize As ULong = Flength
       Dim SizeType As String = ""
       '---

       Try
           Select Case TheSize
               Case Is >= 1099511627776
                   DoubleBytes = CDbl(TheSize / 1099511627776) 'TB
                   Return FormatNumber(DoubleBytes, 2) & " TB"
               Case 1073741824 To 1099511627775
                   DoubleBytes = CDbl(TheSize / 1073741824) 'GB
                   Return FormatNumber(DoubleBytes, 2) & " GB"
               Case 1048576 To 1073741823
                   DoubleBytes = CDbl(TheSize / 1048576) 'MB
                   Return FormatNumber(DoubleBytes, 2) & " MB"
               Case 1024 To 1048575
                   DoubleBytes = CDbl(TheSize / 1024) 'KB
                   Return FormatNumber(DoubleBytes, 2) & " KB"
               Case 0 To 1023
                   DoubleBytes = TheSize ' bytes
                   Return FormatNumber(DoubleBytes, 2) & " bytes"
               Case Else
                   Return ""
           End Select
       Catch
           Return ""
       End Try
   End Function


الدالتين متشابهتين فقط في الاولى يكون البارميتر المرسل هو مسار الملف بينما في الثانية يكون طول الملف هذا كل شيئ

وهذا في حدث تحديد الملف ليتم عرض الحجم وفق التحديد
كود :
   Private Sub ListBox2_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox2.SelectedIndexChanged
       Try
           If ListBox2.Items.Count > 0 Then
               Dim FilePath As String = System.Windows.Forms.Application.StartupPath & "\AttachMents\" & ListBox2.Text
               If Not IsNothing(FilePath) Then
                   Label3.Text = (GetFileSize(FilePath))
               End If
           Else
               Label3.Text = 0
           End If

       Catch ex As Exception

       End Try


   End Sub

طبعا انا وضعت Timer بسيط لتعطيل زر تحميل المرفقات عند عدم وجود ملفات للتحميل
كود :
   'تعطيل زر التحميل لعدم وجود مرفقات
   Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
       If ListBox1.Items.Count > 0 Then
           DownloadAttachements.Enabled = True
       Else
           DownloadAttachements.Enabled = False
       End If

   End Sub

الان و بعد ان فهمنا طبيعة العمل نعود الى الازرار القياسية و تحديدا زر حفظ المقال اي حفظ صفحة HTML داخل جدول المقالات
العملية مقسومة الى شقين الاول حفظ للحقول العادية في الجدول و الثاني حفظ لبنية HTML داخل الحقل Content
كما في السابق انا لن اخزن المقال مرتين في الجدول لذا ساقوم بالبحث عن اسم المقال بدليل رابط المقال فاذا وجد لدينا سنجهض عملية حفظ
محتوى الصفحة فقط و ليس كل اجراء الحفظ بمعنى اخر ربما لسبب ما انت تريد تسمية المقال باسم اخر غير الاسم الافتراضي لذا ستكون قادرا على ذلك بينما عملية تحديث محتويات الصفحة فلن تكون قادرا على ذلك اذ ان الصفحة محفوظة لديك في القاعدة


الشق الاول عملية الحفظ (حدث زر الحفظ العام) اذ ان الحفظ يتم على مستوى كل الجداول (فقط الاجزاء التي تحتوي على تحديثات) هي فقط من سيتم تحديثها

كود :
   'زر الحفظ
   Private Sub BtnSave_Click(sender As System.Object, e As System.EventArgs) Handles BtnSave.Click
       Try
           A = KindBindingSource.Position
           B = PostBindingSource.Position
           C = InfoBindingSource.Position
           '
           Me.Validate()
           '
           KindBindingSource.EndEdit()
           PostBindingSource.EndEdit()
           InfoBindingSource.EndEdit()
           '
           SaveData()
           InfoBindingSource.Position = C
           '
           SaveHtml(sourceString)
           sourceString = ""

           '
           KindBindingSource.Position = A
           PostBindingSource.Position = B
           BindingNavigatorAddNewItem3.Enabled = False
       Catch ex As Exception
           MsgBox(ex.ToString)
       End Try

   End Sub

هل تذكر الاجراء SaveData في الكلاس Connect هو من سيقوم بعملية الحفظ
لاحظ وجود الاجراء SaveHtml و هو الشق الثاني من عملية الحفظ
كود :
   ''' <summary>
   ''' اجراء حفظ المقال
   ''' </summary>
   ''' <param name="HtmlText">"محتويات الصفحة"</param>
   ''' <remarks></remarks>
   Private Sub SaveHtml(ByVal HtmlText As String)
       Dim w2 As Integer

       Using Con
           Dim sw2 As String = "Select IdInfo  From Info Where UrlInfo Like '" & UrlInfoTextBox.Text & "'  "

           Dim SelCommand As New OleDbCommand(sw2, Con)

           If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString
           Con.Open()
           '
           w2 = SelCommand.ExecuteScalar
           '
       End Using
       '
       If w2 > 0 Then
           Dim UpdateText As String = "Update  Info Set Content = @Content Where IdInfo Like '" & w2 & "' "

           Try
               If UrlInfoTextBox.Text <> WebBrowser1.Url.AbsoluteUri Then
                   MsgBox(" الرابط الجديد مختلف عن الرابط المخزن ,قد تكون اخترت مقالة مختلفة  " & vbCrLf & "لن يتم تحديث محتويات المقالة", MsgBoxStyle.Exclamation + MsgBoxStyle.MsgBoxRight + MsgBoxStyle.OkOnly, "تخزين المقال ")
                   Exit Sub
               End If

               Using Con
                   If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString
                   If HtmlText <> "" And HtmlText.Length > 13 Then

                       Dim UpdateCommand1 As New OleDbCommand(UpdateText, Con)
                       If Con.State = ConnectionState.Open Then Con.Close()
                       Con.Open()
                       '
                       Dim CommandParameter1 As New OleDbParameter("@Content", OleDb.OleDbType.LongVarChar)
                       UpdateCommand1.Parameters.Add(CommandParameter1)
                       CommandParameter1.Value = HtmlText
                       Dim S As Integer = UpdateCommand1.ExecuteNonQuery
                       If S > 0 Then
                           ' MsgBox("نجحت عمليت تحديث المقالة")
                       Else
                           MsgBox("فشلت عملية التحديث")
                       End If
                   Else
                       MsgBox("لم يتم الحصول على محتويات الصفحة بعد")
                   End If
               End Using
           Catch ex As Exception
               MsgBox(ex.ToString)
           Finally
               Con.Close()
           End Try

       Else
           MsgBox("لم يتم حفظ عنوان المقال حاول حفظه ثانية")

       End If

   End Sub

اذا دققت في الكود السابق ككل ستجد انني اقوم اولا بتخزين حقول المقالة بدون ارسال محتويات الصفحة و بعدها انا اقوم بتخزين محتويات الصفحة بعد التاكد من من وجودها بدليل رابط المقال
طبعا اذا حاولت تخزين محتويات الصفحة الحالية المعروضة في المستعرض فانه سيقوم بعملية مطابقة رابط الصفحة في المتصفح مع الرابط المعروض حاليا في حقل المقالات فاذا وجد اختلاف سيعطيك رسالة مفادها ان المقالة الحالية التي تريد تخزينها او تحديث محتوياتها مختلفة عن المقالة المعروضة
هذه السلسلة من اجراءات الامان لكي لا نخزن محتويات صفحة لا تمت بصلة لعنوان المقالة
انتهينا من عمليات الحفظ
الان بعض الاجرائيات البسيط مثل عرض شريط حالة التحميل الخاص بالمستعرض كما يلي
كود :
   'حالة تحميل الصفحة
   Private Sub WebBrowser1_ProgressChanged(sender As Object, e As System.Windows.Forms.WebBrowserProgressChangedEventArgs) Handles WebBrowser1.ProgressChanged
       Try
           Dim CurProg As Double

           Dim MaxProg As Double

           CurProg = e.CurrentProgress

           MaxProg = e.MaximumProgress

           ToolStripProgressBar1.Value = (CurProg / MaxProg) * 100

       Catch ex As Exception
           '
       End Try

   End Sub

كود :
   'معلومات حالة التحميل
   Private Sub WebBrowser1_StatusTextChanged(sender As Object, e As System.EventArgs) Handles WebBrowser1.StatusTextChanged
       ToolStripStatusLabel1.Text = WebBrowser1.StatusText
   End Sub

اجراء الفلترة الخاص بزر الفلترة و البحث بحسب اسم المقال
كود :
   'فلترة
   Private Sub BtnSerch_Click(sender As System.Object, e As System.EventArgs) Handles BtnSerch.Click
       If TxtSerch.Text.Trim <> "" Then
           InfoBindingSource.Filter = "[Infoname] LIKE '%" & TxtSerch.Text & "%'"
       End If
   End Sub

زر مسح الفلتر
كود :
   'مسح الفلتر
   Private Sub ToolStripButton3_Click(sender As System.Object, e As System.EventArgs) Handles BtnRemoveFilter.Click
       InfoBindingSource.RemoveFilter()
   End Sub

زر الرجوع و الرئيسية و التحديث الخاصة بالمتصفح
كود :
   'رجوع
   Private Sub BtnBack_Click(sender As System.Object, e As System.EventArgs) Handles BtnBack.Click
       WebBrowser1.GoBack()
   End Sub

   'الرئيسية
   Private Sub BtnHome_Click(sender As System.Object, e As System.EventArgs) Handles BtnHome.Click
       WebBrowser1.GoHome()
   End Sub

   'تحديث
   Private Sub BtnRefresh_Click(sender As System.Object, e As System.EventArgs) Handles BtnRefresh.Click
       If Not WebBrowser1.Url.Equals("about:blank") Then
           WebBrowser1.Refresh()
       End If
   End Sub

صحيح هناك زر اضفته لاحقا للتراجع عن اضافة مقال
كود :
   'زر تراجع عن
   Private Sub BtnUndo_Click(sender As System.Object, e As System.EventArgs) Handles BtnUndo.Click
       InfoBindingSource.CancelEdit()
   End Sub

بعد ان قمنا بتخزين محتويات الصفحة في القاعدة اصبحنا قادرين الان على عرض المحتويات المخزنة في المستعرض
زر عرض المحتويات للمقالة الحالية
كود :
   ''' <summary>
   ''' تحميل الصفحة من القاعدة
   ''' </summary>
   ''' <param name="sender"></param>
   ''' <param name="e"></param>
   ''' <remarks></remarks>
   Private Sub BtnLoadContents_Click(sender As System.Object, e As System.EventArgs) Handles BtnLoadContents.Click
       Dim RowView As DataRowView
       RowView = InfoBindingSource.Current
       Dim Sel1 As String = "Select Content From Info Where IdInfo Like '" & RowView("IdInfo") & "' "
       Try
           Using Con
               If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString

               Dim Command1 As New OleDbCommand(Sel1, Con)
               If Con.State = ConnectionState.Open Then Con.Close()
               Con.Open()
               Dim Red1 As OleDbDataReader = Command1.ExecuteReader
               While Red1.Read
                   If Red1.HasRows = True And Not Red1.IsDBNull(0) Then
                       sourceString = Red1("Content")
                   Else
                       MsgBox("لا يوجد محتويات محفوظة لهذه المقالة")
                       Exit Sub
                   End If
               End While
               If sourceString <> "" Then
                   WebBrowser1.DocumentText = sourceString
               End If
           End Using

       Catch ex As Exception
           MsgBox(ex.ToString)
       End Try

   End Sub

بقيت لدينا ازرار الحذف التي اجلت طرحها للاخر اذ ان عملية الحذف متزامنة بين القاعدة و الملفات المخزنة (المرفقات)
نبدا اولا مع حذف مقال مع مرفقاته
كود :
   'حذف مقال
   Private Sub BindingNavigatorDeleteItem3_Click(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorDeleteItem3.Click
       Try
           If (Me.Validate() And Not (InfoBindingSource Is Nothing)) Then
               If InfoBindingSource.Count > 0 Then

                   Dim DeletStud As DialogResult = MessageBox.Show("سيتم حذف المقال الحالي", "انتبه", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign)
                   If DeletStud = Windows.Forms.DialogResult.Yes Then


                       '==========حذف الملفات المرفقة=======================
                       'البحث عن الملف في مجلد التخزين
                       If ListBox2.Items.Count > 0 Then
                           For i As Integer = 0 To ListBox2.Items.Count - 1
                               Dim RowV As DataRowView = ListBox2.Items(i)
                               Dim os As String() = System.IO.Directory.GetFiles(System.Windows.Forms.Application.StartupPath & "\AttachMents", RowV("AttachName"))
                               If os.Length >= 1 Then
                                   Dim filePaths() As String = Directory.GetFiles(System.Windows.Forms.Application.StartupPath & "\AttachMents", RowV("AttachName"))
                                   For Each filePath As String In filePaths
                                       File.Delete(filePath)
                                   Next

                               End If
                               AttachBindingSource.RemoveAt(i)
                           Next
                       End If

                       'حذف المقال
                       InfoBindingSource.EndEdit()
                       InfoBindingSource.RemoveCurrent()
                   End If

               End If
           End If

       Catch ex As Exception
           MsgBox(ex.ToString)
       End Try

   End Sub

و من ثم حذف فرع كامل مع كل مقالاته و الملفات المخزنه مع كل مقال
انا جعلت عملية الحذف محمية بكلمة مرور لكي لا نتورط و نحذف كل شيئ الا  بعد التأكد من ذلك
كود :
   'حذف فرع
   Private Sub BindingNavigatorDeleteItem1_Click_1(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorDeleteItem1.Click
       Try
           If (Me.Validate() And Not (PostBindingSource Is Nothing)) Then

               If PostBindingSource.Count > 0 Then

                   Dim DeletStud1 As DialogResult = MessageBox.Show("سيتم حذف الفرع بما يحتويه من مقالات" & vbCrLf & "عملية الحذف محمية", "انتبه", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign)
                   If DeletStud1 = Windows.Forms.DialogResult.Yes Then
                       Dim Message, Title, DefaultValue As String
                       Message = "ادخل كلمة المرور"
                       Title = "نموذج حماية"
                       DefaultValue = "ادخل كلمة المرور"

                       Dim ReturnValue As String = InputBox(Message, Title, DefaultValue)
                       If ReturnValue = "admin" Then

                           '====**********======
                           Dim DeletStud As DialogResult = MessageBox.Show("سيتم حذف الفرع بما يحتويه من مقالات", "انتبه", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign)
                           If DeletStud = Windows.Forms.DialogResult.Yes Then

                               '==========حذف الملفات المرفقة=======================
                               'البحث عن الملف في مجلد التخزين
                               If InfoBindingSource.Count > 0 Then
                                   For p As Integer = 0 To InfoBindingSource.Count - 1
                                       '
                                       If AttachBindingSource.Count > 0 Then
                                           For i As Integer = 0 To AttachBindingSource.Count - 1
                                               Dim RowV As DataRowView = AttachBindingSource.Current
                                               Dim os As String() = System.IO.Directory.GetFiles(System.Windows.Forms.Application.StartupPath & "\AttachMents", RowV("AttachName"))
                                               If os.Length >= 1 Then
                                                   Dim filePaths() As String = Directory.GetFiles(System.Windows.Forms.Application.StartupPath & "\AttachMents", RowV("AttachName"))
                                                   For Each filePath As String In filePaths
                                                       File.Delete(filePath)
                                                   Next

                                               End If
                                               AttachBindingSource.RemoveAt(i)
                                           Next
                                       End If

                                       '==============


                                       ' InfoBindingSource.RemoveAt(p)
                                   Next


                               End If
                               '==========================
                               PostBindingSource.EndEdit()
                               InfoBindingSource.EndEdit()
                               '
                               PostBindingSource.RemoveCurrent()
                           End If



                       End If
                   Else
                       Exit Sub
                   End If
               End If

           End If

       Catch ex As Exception
           ' MsgBox(ex.ToString)
       End Try

   End Sub

حذف تصنيف باكمله مع كل الفروع و المقالات و المرفقات المرتبطه به كذلك محمي بكلمة مرور 
كود :
   'حذف التصنيف
   Private Sub BindingNavigatorDeleteItem_Click(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorDeleteItem.Click
       Try
           If (Me.Validate() And Not (KindBindingSource Is Nothing)) Then
               If KindBindingSource.Count > 0 Then

                   Dim DeletStud1 As DialogResult = MessageBox.Show("سيتم حذف التصنيف الحالي بكل ما يحتويه" & vbCrLf & "عملية الحذف محمية", "انتبه", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign)
                   If DeletStud1 = Windows.Forms.DialogResult.Yes Then
                       Dim Message, Title, DefaultValue As String
                       Message = "ادخل كلمة المرور"
                       Title = "نموذج حماية"
                       DefaultValue = "ادخل كلمة المرور"

                       Dim ReturnValue As String = InputBox(Message, Title, DefaultValue)
                       If ReturnValue = "admin" Then
                           '
                           Dim DeletStud As DialogResult = MessageBox.Show("سيتم حذف التصنيف الحالي بكل ما يحتويه", "انتبه", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign)
                           If DeletStud = Windows.Forms.DialogResult.Yes Then
                               KindBindingSource.EndEdit()
                               PostBindingSource.EndEdit()
                               InfoBindingSource.EndEdit()
                               'حذف كل الفروع
                               For i As Integer = 0 To PostBindingSource.Count - 1
                                   DelAllPOsters()
                               Next
                               'حذف التصنيف
                               KindBindingSource.RemoveCurrent()

                           End If

                       End If

                   Else
                       Exit Sub

                   End If
               End If

           End If

       Catch ex As Exception
           MessageBox.Show(ex.Message, "زر الحذف العام", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
       End Try

   End Sub

انا استخدمت اجراء لحذف كل الفروع بداخل التصنيف DelAllPOsters
كود :
   'حذف فرع بشكل مباشر
   Private Sub DelAllPOsters()
       Try
           If (Me.Validate() And Not (PostBindingSource Is Nothing)) Then

               If PostBindingSource.Count > 0 Then

                   '==========حذف الملفات المرفقة=======================
                   'البحث عن الملف في مجلد التخزين
                   If InfoBindingSource.Count > 0 Then
                                   For p As Integer = 0 To InfoBindingSource.Count - 1
                                       '
                                       If AttachBindingSource.Count > 0 Then
                                           For i As Integer = 0 To AttachBindingSource.Count - 1
                                               Dim RowV As DataRowView = AttachBindingSource.Current
                                               Dim os As String() = System.IO.Directory.GetFiles(System.Windows.Forms.Application.StartupPath & "\AttachMents", RowV("AttachName"))
                                               If os.Length >= 1 Then
                                                   Dim filePaths() As String = Directory.GetFiles(System.Windows.Forms.Application.StartupPath & "\AttachMents", RowV("AttachName"))
                                                   For Each filePath As String In filePaths
                                                       File.Delete(filePath)
                                                   Next

                                               End If
                                               AttachBindingSource.RemoveAt(i)
                                           Next
                                       End If


                                   Next


                               End If
                               '==========================
                               PostBindingSource.EndEdit()
                               InfoBindingSource.EndEdit()
                               '
                               PostBindingSource.RemoveCurrent()
                           End If



                       End If

       Catch ex As Exception

       End Try

   End Sub
و هو يشبه اجراء حذف الفروع السابق لكنه بدون حماية

لم يتبقى لدينا شيئ في هذه الواجهة على ما اعتقد
اكتملت كل الخيوط و الكمال لله وحده
بقي لدينا نموذج الاعدادات الخاص بالدخول للمواقع و كيفية التعامل معه مع شرح بسيط عن مصادر الصفحات الخاصة بالمواقع ان امكنني ذلك

ساعرض بعض الصور الاولية لنموذج الاعدادات SettingForm مع اختلاف المواقع التي نريد الدخول اليها





اريدك فقط ان تركز في جزئية بارمترات الدخول لتعرف بعدها ماذا تعني كل هذه الحقول التي في النموذج
عمليا كل موقع لديه صفحة للدخول اليه و في هذه الصفحة يكون هناك مربعات نصوص لادخال اسم المستخدم و كلمة المرور 
وزر الدخول ايضا , ما نقوم به اثناء انشاء طلب و ارسال البارمترات معه هو عملية ادخال في هذه الحقول و من ثم ضغط زر الدخول
فاذا تمت المصادقة نكون قد حصلنا على مبتغانا
الازرار في اعلى النموذج هي اسماء الحقول في الموقع
اما مجموعة بيانات الدخول فهي المعلومات التي سندخلها 
اسم المستخدم الخاص بك و كلمة المرور ورابط صفحة الدخول للموقع مع اجراء الدخول
انا قمت بتزويد النموذج ببعض الاجراءات و اسماء الحقول الخاصة بالدخول لتجدها جاهزة
فمثلا موقعنا هنا يستخدم username لاسم المستخدم,password لكلمة المرور
و يعتمد الطريقة action=do_login
بينما في مواقع اخرى قد تختلف الطريقة وفق تصميم الموقع و اسماء الحقول
هذا النموذج مرتبط مع جدول LoginsTb في قاعدة البيانات حتى تكون قادرا على تخزين مواقعك و طريقة دخولك لها
و هو ايضا مرتبط باعدادات البرنامج حتى تحفظ اعدادتك للموقع الافتراضي الذي تريد الابحار في صفحاته
فقط اختر موقعك ثم (تخزين كاعداد افتراضي) و اترك الباقي على البرنامج فهو سيتكفل بارسال المعلومات من الاعدادت

اما في جانب الكود فليس هناك الكثير للتحدث عنه فهو كما سابق الاكواد التي شرحناها
كود :
Public Class SettingForm

   Dim C As Integer

حدث تحميل النموذج
كود :
   Private Sub SettingForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
       LoadLoginDataSet()

       Me.LoginBindingSource.DataSource = LoadLoginDataSet()
       Me.LoginBindingSource.DataMember = "LoginsTb"

       BindingFileds()

       TextBox1.Text = My.Settings.sitname

   End Sub

زر تخزين الاعدادت الافتراضية
كود :
   Private Sub BtnSaveSetting_Click(sender As System.Object, e As System.EventArgs) Handles BtnSaveSetting.Click
       Try
           My.Settings.LoginUrl = TxtLoginUrl.Text
           My.Settings.User = TxtUser.Text
           My.Settings.Password = TxtPassword.Text
           My.Settings.ActionStr = TxtAction.Text
           My.Settings.Parmms = TxtformParams.Text
           My.Settings.sitname = TxtSiteName.Text
           '
           My.Settings.Inputuser = Txus.Text
           My.Settings.Inputpass = Txps.Text
           My.Settings.InputAction = Txact.Text

           '
           My.Settings.Save()
           TextBox1.Text = My.Settings.sitname

       Catch ex As Exception
           MsgBox(ex.ToString)
       End Try

   End Sub

زر تخزين لحفظ التعديلات و الاضافات الى الجدول LoginsTb

كود :
   Private Sub BtnSave_Click(sender As System.Object, e As System.EventArgs) Handles BtnSave.Click
       Try
           C = LoginBindingSource.Position
           '
           If TxtUser.TextLength > 0 And TxtPassword.MaxLength > 0 Then

               Dim usinput, passinput, actinput As String
               usinput = Txus.SelectedItem
               passinput = Txps.SelectedItem
               actinput = Txact.SelectedItem

               Dim formParams As String = String.Format(usinput & "={0}&" & passinput & "={1}&" & actinput & "={2}", TxtUser.Text, TxtPassword.Text, TxtAction.Text)
               TxtformParams.Text = formParams
           End If
           Me.Validate()
           LoginBindingSource.EndEdit()
           '
           SaveLogins()
           LoginBindingSource.Position = C
           '
       Catch ex As Exception
           MsgBox(ex.ToString)
       End Try

   End Sub

اجراء ربط الحقول 

كود :
   Private Sub BindingFileds()
       Me.TxtSiteName.DataBindings.Add(New Binding("Text", LoginBindingSource, "SiteName"))
       Me.TxtLoginUrl.DataBindings.Add(New Binding("Text", LoginBindingSource, "LoginUrl"))
       Me.TxtUser.DataBindings.Add(New Binding("Text", LoginBindingSource, "usernamee"))
       Me.TxtPassword.DataBindings.Add(New Binding("Text", LoginBindingSource, "Passworde"))
       Me.TxtAction.DataBindings.Add(New Binding("Text", LoginBindingSource, "ActionStr"))
       Me.TxtformParams.DataBindings.Add(New Binding("Text", LoginBindingSource, "formParams"))
       '
       Me.Txus.DataBindings.Add(New Binding("Text", LoginBindingSource, "Inputuser"))
       Me.Txps.DataBindings.Add(New Binding("Text", LoginBindingSource, "Inputpass"))
       Me.Txact.DataBindings.Add(New Binding("Text", LoginBindingSource, "InputAction"))


   End Sub

زر الاضافة

كود :
   Private Sub BindingNavigatorAddNewItem_Click(sender As System.Object, e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click
       LoginBindingSource.AddNew()
       C = LoginBindingSource.Position
   End Sub

حدث تغير التحديد لتخزين نوع الاجراء في الحقل الهدف

كود :
   Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
       If ComboBox1.SelectedItem <> String.Empty Then
           TxtAction.Text = ComboBox1.SelectedItem
       End If

   End Sub

تم بحمد الله و فضله , ارجو ان تعذروني عن كل خلل او تقصير حاصل ضمن المقال
و لاتنسونا من دعوة صالحة في ظهر الغيب في هذا الشهر الفضيل , اخوكم ابو ليلى

بالنسبة للبرنامج ساضعه لاحقا حتى تكتمل لدي بعض الافكار و يكون جاهزا للعمل دمتم بخير
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
تم الشكر بواسطة: Amir_Alzubidy , الوادي , Hzar


الردود في هذا الموضوع
RE: العلاقات بين الجداول-الاضافة و الحذف و التعديل-برنامج لحفظ مصادر الموقع - بواسطة ابو ليلى - 21-06-16, 02:49 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  نظرة على DropBox SDK و التعامل معها +برنامج رفع و تحميل ملفات ابو ليلى 5 5,975 16-08-24, 04:39 PM
آخر رد: ackore
  كيف تتعامل مع برنامج الإكسيل من برنامجك rinawi 7 7,230 12-11-22, 12:11 AM
آخر رد: خالد العصاوي
  برنامج مبيعات ومشتريات وإدارة أعمال ( الفاتورة الإلكترونية ) yassoo1985 2 2,820 04-06-22, 01:14 PM
آخر رد: yassoo1985
Heart طلب برنامج Advanced Installer أبو خالد الشكري 0 1,718 16-05-22, 09:12 PM
آخر رد: أبو خالد الشكري
  أهم طرق إدارة المخازن وتطبيقها على برنامج مخازن وارد ومنصرف Menna ahmeed 0 2,824 27-04-22, 12:52 PM
آخر رد: Menna ahmeed
  طريقة إنشاء برنامج طباعة ملصقات الباركود ملهمـ 1 5,023 22-12-21, 05:09 PM
آخر رد: alessam4pro
Heart [VB.NET] برنامج ادارة المطاعم و الكافيهات mgr21002100 6 7,412 14-01-21, 07:59 PM
آخر رد: abarrak
  مثال للتعامل مع الجداول المرتبطة - عن طريق الكلاسات ابو ليلى 24 16,452 04-10-20, 06:16 PM
آخر رد: محمد بن عطية
  لفهم كيفية الربط الذي يتم بين الجداول viv 4 5,409 03-10-20, 05:34 PM
آخر رد: Arfat007
  تفعيل برنامج Visual Studio 2019 Adilo idabdellah 4 12,561 20-05-20, 11:48 AM
آخر رد: الفاضي

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


يقوم بقرائة الموضوع: