09-01-18, 06:42 PM
(آخر تعديل لهذه المشاركة : 09-01-18, 06:48 PM {2} بواسطة عبدالله الدوسري.)
أخي الكريم
BindingSource1.Position
لا يشير إلى السجل الموجود في الجدول tb1 كما يبدو لك
الـ Position يشير إلى موقع الموشر في BindingSource1
وهو يبداء من الرقم صفر
على سبيل المثال عند فرز العناصر الموجودة في الـ BindingSource1 من خلال ترتيب أحد الأعمدة من الأصغر إلى الأكبر أو العكس
الـ Position لن يتغير بينما السجل الذي يتم التأشير علية قد اختلف
جرب ونفذ الكود التالي في Sub مختلف
هذا الكود فقط للتجرة وليس الحل
لإثبات أن الـ Position يختلف عن Current فقط لا غير
لا تنسى تغير الـXXXXXXX الموجودة إلى اسم احد الحقول في الجدول ويكون نص فقط للتجربة لإظهار القيمة في رسالة من Row1 و Row2
لاحظ Row1 هو السجل الفعلي الذي يقوم الـ BindingSource1 بالتأشير علية
لاحظ Row2 سيجلب سجل مختلف عن الذي يؤشر علية الـ BindingSource1
لأن الـ Position يختلف عن Current
الحل المقترح :
لتبسيط الأمور استخدم طريقة تسمى إكتنشن Extension
ضع الكود التالي في نهاية الفور آخر سطر وخارج الكود الخاص بالفور :
هذة الإضافة خارج موضوعنا لكن أنا احب اشتغل بهالطريقة ويمكن تحب تعرفها فقط لا غير
لاحظ هذة فنكشن Function أسمها ToByteArray
من اسمها واضح تعني إلى مصفوفة
أي التحويل إلى مصفوفة بايتات
ستستخدمها في الكود التالي
وهذة الطريقة تسمح لك بإضافة أي اوامر أو وظائف إضافية لأي نوع من أنواع الـ Net.
على سبيل المثال الكلاس System.Drawing.Image
لا يحتوي على وظيفة لتحويل الصورة Image إلى ()ByteArray
الـإكتنشن Extension تسمح لك بإضافة هذة الوظيفة إلى الكلاس System.Drawing.Image
استخدم الكود التالي بدلاً من الكود الذي تستخدمة :
الملاحظات التي تبداء بالرقم 999 لتوظيح التغيير الذي قمت به
تحياتي
BindingSource1.Position
لا يشير إلى السجل الموجود في الجدول tb1 كما يبدو لك
الـ Position يشير إلى موقع الموشر في BindingSource1
وهو يبداء من الرقم صفر
على سبيل المثال عند فرز العناصر الموجودة في الـ BindingSource1 من خلال ترتيب أحد الأعمدة من الأصغر إلى الأكبر أو العكس
الـ Position لن يتغير بينما السجل الذي يتم التأشير علية قد اختلف
جرب ونفذ الكود التالي في Sub مختلف
هذا الكود فقط للتجرة وليس الحل
لإثبات أن الـ Position يختلف عن Current فقط لا غير
لا تنسى تغير الـXXXXXXX الموجودة إلى اسم احد الحقول في الجدول ويكون نص فقط للتجربة لإظهار القيمة في رسالة من Row1 و Row2
PHP كود :
Dim drv As DataRowView = BindingSource1.Current
Dim Row1 As DataRow = drv.Row
Dim Row2 As DataRow = DataSet1.Tables("tb1").Rows(BindingSource1.Position)
MsgBox("Row 1 = " & Row1("xxxxxxx") & ", Row 2 = " & Row2("xxxxxxxx"))
لاحظ Row2 سيجلب سجل مختلف عن الذي يؤشر علية الـ BindingSource1
لأن الـ Position يختلف عن Current
الحل المقترح :
لتبسيط الأمور استخدم طريقة تسمى إكتنشن Extension
ضع الكود التالي في نهاية الفور آخر سطر وخارج الكود الخاص بالفور :
PHP كود :
Public Module module1
<System.Runtime.CompilerServices.Extension>
Public Function ToByteArray(img As Image) As Byte()
Using strm As New IO.MemoryStream
img.Save(strm, img.RawFormat)
Return strm.GetBuffer()
End Using
End Function
End Module
هذة الإضافة خارج موضوعنا لكن أنا احب اشتغل بهالطريقة ويمكن تحب تعرفها فقط لا غير
لاحظ هذة فنكشن Function أسمها ToByteArray
من اسمها واضح تعني إلى مصفوفة
أي التحويل إلى مصفوفة بايتات
ستستخدمها في الكود التالي
وهذة الطريقة تسمح لك بإضافة أي اوامر أو وظائف إضافية لأي نوع من أنواع الـ Net.
على سبيل المثال الكلاس System.Drawing.Image
لا يحتوي على وظيفة لتحويل الصورة Image إلى ()ByteArray
الـإكتنشن Extension تسمح لك بإضافة هذة الوظيفة إلى الكلاس System.Drawing.Image
استخدم الكود التالي بدلاً من الكود الذي تستخدمة :
الملاحظات التي تبداء بالرقم 999 لتوظيح التغيير الذي قمت به
PHP كود :
Try
If PictureBox1.Image IsNot Nothing Then
If MsgBox(" هل تريد استبدال الصورة الحالية " & " ؟ ", MsgBoxStyle.Exclamation + MsgBoxStyle.MsgBoxRight + MsgBoxStyle.OkCancel, "استبدال صورة") = MsgBoxResult.Cancel Then Exit Sub
Else
If MsgBox(" استمرار اضافة صورة جديدة للسجل رقم " & Label2.Text & " ؟ ", MsgBoxStyle.Exclamation + MsgBoxStyle.MsgBoxRight + MsgBoxStyle.OkCancel, "ادراج صورة") = MsgBoxResult.Cancel Then Exit Sub
End If
Dim OFG As New OpenFileDialog
OFG.Filter = "Files(*.jpg)|*.jpg|Files(*.gif)|*.gif|Files(*.bmp)|*.bmp|Files(*.png)|*.png"
OFG.Title = "ادراج صورة"
OFG.FileName = ""
If OFG.ShowDialog() = Windows.Forms.DialogResult.OK Then
'999 بالتأشير علية BindingSource1 لجب السجل الذي يقوم Current استخدم
Dim drv As DataRowView = BindingSource1.Current
'999 DataRow إلى DataRowView والذي هو من نوع BindingSource1 حول نوع مؤشر
Dim Row As DataRow = drv.Row
'999 إقراء البايتات مباشرتاً من الملف
Dim NewImage As Image = Image.FromStream(New IO.MemoryStream(IO.File.ReadAllBytes(OFG.FileName)))
Dim NewBitmap As New Bitmap(NewImage, 200, 225)
'999 Row ضع البايتات مباشرتاً في الـ
'999 هي في الأصل غير موجودة لكن بعد عمل إكتنشن يمكن إستخدامها كالتالي ToByteArray لاحظ الوظيفة
Row("image_mail") = NewBitmap.ToByteArray
BindingSource1.EndEdit()
DataAdapter1.Update(Row)
MsgBox("تم حفظ الصورة نجاح", MsgBoxStyle.MsgBoxRight + MsgBoxStyle.Information, "نجاح ")
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
تحياتي
