RE: مساعدة في عمل برنامج تعليم - ابو ليلى - 16-11-16
اهلا اخي شمس جدول المحتويات سيكون لكل المواضيع صممه بالشكل الذي تريد
اعرف ان الامور ستختلط عليك لان هذا النوع من العلاقات صعب جدا و التعامل معه مرير و لكن الهدف كان التوضيح فقط
لا عليك اخي شمس , باذن المولى عز و جل ساحاول ان اوجهك بطريقة جيدة لفهم الالية (حسب قدرتي)
سارفق لك ملف قاعدة البيانات و سابدأ بشرح مقتضب عبر مثال يعطيك القدرة على فهم الالية
ابدأ مشروع جديد وادرج فيه فورم (Form1) و ادرج ايضاً مديول وسميه (Connect)
سنضيف داخل المديول بعض الدوال البسيطة لتسهل علينا العمل (لكي لا نكرر كتابة الاكواد)
داخل المديول سنكتب هذه الاكواد
PHP كود :
ImportsSystem.Data.OleDb Module Connect Public ConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\TestDb.accdb" Public Con As New OleDbConnection(ConnectionString)
Public Sub CloseConnect() If Con.State = ConnectionState.Open Then Con.Close() End If End Sub
Public Sub OpenConnect() If Con.State = ConnectionState.Closed Then If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString Con.Open() End If End Sub
Public Function SelectWithString(ByVal TblNmae As String, ByVal Fileds() As String, ByVal CondFiled As String, ByVal Match As String) As DataTable
If Fileds.Length = 0 Then MessageBox.Show("تاكد من ملئ مصفوفة الحقول") Return Nothing End If
Dim SelectStatement As String = "Select " Dim SetFileds As String = "" For Each str As String In Fileds SetFileds += str + "," Next
If SetFileds.EndsWith(",") Then SetFileds = SetFileds.Remove(SetFileds.Count - 1, 1)
SelectStatement += SetFileds & " From " & TblNmae & " Where " & CondFiled & " Like '" & Match & "' " If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString Dim Cmd As New OleDbCommand(SelectStatement, Con) Dim Dt As New DataTable Dt.Clear() Dim Da As New OleDbDataAdapter(Cmd) If Con.State = ConnectionState.Closed Then Con.Open() Da.Fill(Dt) Cmd.Dispose() Return Dt End Function
Public Function SelectWithInteger(ByVal TblNmae As String, ByVal Fileds() As String, ByVal CondFiled As String, ByVal ID As Integer) As DataTable
If Fileds.Length = 0 Then MessageBox.Show("تاكد من ملئ مصفوفة الحقول") Return Nothing End If
Dim SelectStatement As String = "Select " Dim SetFileds As String = "" For Each str As String In Fileds SetFileds += str + "," Next
If SetFileds.EndsWith(",") Then SetFileds = SetFileds.Remove(SetFileds.Count - 1, 1)
SelectStatement += SetFileds & " From " & TblNmae & " Where " & CondFiled & " Like '" & ID & "' " If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString Dim Cmd As New OleDbCommand(SelectStatement, Con) Dim Dt As New DataTable Dt.Clear() Dim Da As New OleDbDataAdapter(Cmd) If Con.State = ConnectionState.Closed Then Con.Open() Da.Fill(Dt) Cmd.Dispose() Return Dt End Function
Public Function SelectFTableNormal(ByVal TblNmae As String, ByVal Fileds() As String) As DataTable If Fileds.Length = 0 Then MessageBox.Show("تاكد من ملئ مصفوفة الحقول") Return Nothing End If
Dim SelectStatement As String = "Select " Dim SetFileds As String = "" For Each str As String In Fileds SetFileds += str + "," Next
If SetFileds.EndsWith(",") Then SetFileds = SetFileds.Remove(SetFileds.Count - 1, 1)
SelectStatement += SetFileds & " From " & TblNmae If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString Dim Cmd As New OleDbCommand(SelectStatement, Con) Dim Dt As New DataTable Dt.Clear() Dim Da As New OleDbDataAdapter(Cmd) If Con.State = ConnectionState.Closed Then Con.Open() Da.Fill(Dt) Cmd.Dispose() Return Dt End Function
Public Function GetFiled(ByVal ReturnFiled As String, ByVal Tbl As String, ByVal CondFiled As String, ByVal Id As String) As String Dim serch As String = "" serch = "Select " & ReturnFiled & " From " & Tbl & " Where " & CondFiled & " Like '" & Id & "' "
Dim Cmd As New OleDbCommand(serch, Con) Dim ReturnResult As String = "" OpenConnect() Dim red As OleDbDataReader = Cmd.ExecuteReader While red.Read If red.HasRows Then If Not (red(ReturnFiled) Is Nothing) Or red(ReturnFiled).ToString.Length > 0 Then ReturnResult = red(ReturnFiled).ToString Else ReturnResult = 0 End If End If End While red.Close() Cmd.Dispose() CloseConnect() Return ReturnResult End Function
End Module
الاكواد بسيطة جدا و هي تقوم بالعمليات الاعتيادية (جلب البيانات وفق شرط و بدون شرط) ساقوم بشرحها الان
PHP كود :
Public ConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\TestDb.accdb" Public Con As New OleDbConnection(ConnectionString)
Public Sub CloseConnect() If Con.State = ConnectionState.Open Then Con.Close() End If End Sub
Public Sub OpenConnect() If Con.State = ConnectionState.Closed Then If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString Con.Open() End If End Sub
في هذا الكود انا اقوم بتاسيس اتصال مع القاعدة الموجودة في مجلد البرنامج و لدي دالتان واحدة تقوم بفتح الاتصال و الثانية تقوم بغلق الاتصال
الدوال
PHP كود :
Public Function SelectWithString(ByVal TblNmae As String, ByVal Fileds() As String, ByVal CondFiled As String, ByVal Match As String) As DataTable
If Fileds.Length = 0 Then MessageBox.Show("تاكد من ملئ مصفوفة الحقول") Return Nothing End If
Dim SelectStatement As String = "Select " Dim SetFileds As String = "" For Each str As String In Fileds SetFileds += str + "," Next
If SetFileds.EndsWith(",") Then SetFileds = SetFileds.Remove(SetFileds.Count - 1, 1)
SelectStatement += SetFileds & " From " & TblNmae & " Where " & CondFiled & " Like '" & Match & "' " If Con.ConnectionString = Nothing Then Con.ConnectionString = ConnectionString Dim Cmd As New OleDbCommand(SelectStatement, Con) Dim Dt As New DataTable Dt.Clear() Dim Da As New OleDbDataAdapter(Cmd) If Con.State = ConnectionState.Closed Then Con.Open() Da.Fill(Dt) Cmd.Dispose() Return Dt End Function
عمل هذه الدالة ان تقوم بجلب البيانات (الحقول) من جدول ما وفق شرط ما و تعود لي بكائن جدول (DataTable)
الوسائط المطلوبة (اسم الجدول و مصفوفة الحقول و الحقل الشرطي و قيمة الحقل الشرطي) لا عليك سترى مدى سهولتها عند استعمالها
سافرض انك تريد جلب الحقول (ID,Name) من الجدول TBL1 وفق شرط ان يكون الحقل (Name="العلوم")
فانت ستستخدم الدالة وفق الطريقة التالية
PHP كود :
Dim Fileds() As String = Nothing Fileds = New String() {"ID", "Name"}
Dim TBL1 As New DataTable TBL1=SelectWithString("TBL1", Fileds, "Name", "العلوم")
كما ترى صديقي العملية بسيطة و مختصرة بنفس الوقت تغنيني عن اعادة كتابة الاكواد
الدالة الثانية و الثالثة لهما نفس العمل مع اختلاف في الوسائط فمرة نحن نجلب وفق حقل نصي و مرة نجلب وفق حقل رقمي ومرة بدون شروط
و اما الدالة الاخيرة فهي تجلب بيانات حقل واحد بالاعتماد على شرط محدد
اتمنى ان يكون الشرح بسيط وسهل
الان ننتقل الى واجهة النموذج و نضيف اثنين كومبو بوكس(ComboBox) واحد للمواد و واحد للمجلدات
المواد=Cmb_M
المجلدات=Cmb_F
و نضيف (ListBox) نسميها (ListContent) سنستخدمها لعرض عناوين المواضيع من جدول المحتويات
اما محتويات الموضوع نستخدم لها (RichTextBox)
كما في الصورة التالية
الان الى كود النموذج
PHP كود :
Public Class TForm
Dim TB_M, TB_F, TB_Content As New DataTable Dim Fileds() As String = Nothing
Private Sub M_Cmb_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Cmb_M.SelectedIndexChanged Fileds = New String() {"MF_ID", "F_Nmae"} TB_F = SelectWithString("TB_MF", Fileds, "M_Nmae", Cmb_M.Text) Cmb_F.DataSource = TB_F Cmb_F.DisplayMember = "F_Nmae" Cmb_F.ValueMember = "MF_ID" End Sub
Private Sub F_Cmb_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Cmb_F.SelectedIndexChanged
Fileds = New String() {"Cont_ID", "Cont_Title"} TB_Content = SelectWithInteger("TB_Content", Fileds, "MF_ID", Cmb_F.SelectedValue) ListContent.DataSource = TB_Content ListContent.DisplayMember = "Cont_Title" ListContent.ValueMember = "Cont_ID"
End Sub
Private Sub ListContent_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListContent.SelectedIndexChanged If Not TypeOf (ListContent.SelectedValue) Is DataRowView Then RichTextBox1.Text = GetFiled("Content", "TB_Content", "Cont_ID", ListContent.SelectedValue) End If End Sub
Private Sub TForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load Fileds = New String() {"M_ID", "M_Name"} TB_M = SelectFTableNormal("TB_M", Fileds) Cmb_M.DataSource = TB_M Cmb_M.DisplayMember = "M_Name" ' End Sub
End Class
كما ترى العملية جدا بسيطة حاول تدرس الكود و شوف النتائج
بالنسبة لضبط الادخالات سيكون كالتالي
ادخال المواد في نموذج منفصل
و ادخال المجلدات في نموذج منفصل ايضاً
اما عملية اضافة المواضيع ستتم في صيغة (مجلد لكل مادة بدون تكرار في الجدول الرابط) و تحتها تندرج المواضيع
RE: مساعدة في عمل برنامج تعليم - شمس الدين 03 - 16-11-16
السلام عليكم ورحمة الله وبركاته
جزاك الله خيرا ووفقك لما يحبه ويرضاه
شكرا لك
ساحاول ادرس الكود واطبق الشرح
الى ان افهمه واتقنه
زادك الله علما و نفع بك
RE: مساعدة في عمل برنامج تعليم - شمس الدين 03 - 16-11-16
السلام عليكم
عندي خطأ لما افتح البرنامج
كذالك ارى ان الكود ليس
سي شارب
RE: مساعدة في عمل برنامج تعليم - ابو ليلى - 16-11-16
اعذرني لم اراعي انك تستخدم #C
على كل حال هذا الكود بـ #C
سنغير المديول الى Static Class حيث في #C لا يوجد Module
اضف كلاس للمشروع و سميه Connect و هذا كوده
PHP كود :
using Microsoft.VisualBasic; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Data.OleDb; using System Windows.Forms;
static class Connect { public static string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\TestDb.accdb";
public static OleDbConnection Con = new OleDbConnection(ConnectionString);
public static void CloseConnect() { if (Con.State == ConnectionState.Open) { Con.Close(); } }
public static void OpenConnect() { if (Con.State == ConnectionState.Closed) { if (Con.ConnectionString == null) Con.ConnectionString = ConnectionString; Con.Open(); } }
public static DataTable SelectWithString(string TblNmae, string[] Fileds, string CondFiled, string Match) {
if (Fileds.Length == 0) { MessageBox.Show("تاكد من ملئ مصفوفة الحقول"); return null; }
string SelectStatement = "Select "; string SetFileds = ""; foreach (string str in Fileds) { SetFileds += str + ","; }
if (SetFileds.EndsWith(",")) SetFileds = SetFileds.Remove(SetFileds.Length - 1, 1);
SelectStatement += SetFileds + " From " + TblNmae + " Where " + CondFiled + " Like '" + Match + "' "; if (Con.ConnectionString == null) Con.ConnectionString = ConnectionString; OleDbCommand Cmd = new OleDbCommand(SelectStatement, Con); DataTable Dt = new DataTable(); Dt.Clear(); OleDbDataAdapter Da = new OleDbDataAdapter(Cmd); if (Con.State == ConnectionState.Closed) Con.Open(); Da.Fill(Dt); Cmd.Dispose(); return Dt; }
public static DataTable SelectWithInteger(string TblNmae, string[] Fileds, string CondFiled, int ID) {
if (Fileds.Length == 0) { MessageBox.Show("تاكد من ملئ مصفوفة الحقول"); return null; }
string SelectStatement = "Select "; string SetFileds = ""; foreach (string str in Fileds) { SetFileds += str + ","; }
if (SetFileds.EndsWith(",")) SetFileds = SetFileds.Remove(SetFileds.Length - 1, 1);
SelectStatement += SetFileds + " From " + TblNmae + " Where " + CondFiled + " Like '" + ID + "' "; if (Con.ConnectionString == null) Con.ConnectionString = ConnectionString; OleDbCommand Cmd = new OleDbCommand(SelectStatement, Con); DataTable Dt = new DataTable(); Dt.Clear(); OleDbDataAdapter Da = new OleDbDataAdapter(Cmd); if (Con.State == ConnectionState.Closed) Con.Open(); Da.Fill(Dt); Cmd.Dispose(); return Dt; }
public static DataTable SelectFTableNormal(string TblNmae, string[] Fileds) { if (Fileds.Length == 0) { MessageBox.Show("تاكد من ملئ مصفوفة الحقول"); return null; }
string SelectStatement = "Select "; string SetFileds = ""; foreach (string str in Fileds) { SetFileds += str + ","; }
if (SetFileds.EndsWith(",")) SetFileds = SetFileds.Remove(SetFileds.Length - 1, 1);
SelectStatement += SetFileds + " From " + TblNmae; if (Con.ConnectionString == null) Con.ConnectionString = ConnectionString; OleDbCommand Cmd = new OleDbCommand(SelectStatement, Con); DataTable Dt = new DataTable(); Dt.Clear(); OleDbDataAdapter Da = new OleDbDataAdapter(Cmd); if (Con.State == ConnectionState.Closed) Con.Open(); Da.Fill(Dt); Cmd.Dispose(); return Dt; }
public static string GetFiled(string ReturnFiled, string Tbl, string CondFiled, string Id) { string serch = ""; serch = "Select " + ReturnFiled + " From " + Tbl + " Where " + CondFiled + " Like '" + Id + "' ";
OleDbCommand Cmd = new OleDbCommand(serch, Con); string ReturnResult = ""; OpenConnect(); OleDbDataReader red = Cmd.ExecuteReader(); while (red.Read()) { if (red.HasRows) { if ((red[ReturnFiled] != null) | red[ReturnFiled].ToString().Length > 0) { ReturnResult = red[ReturnFiled].ToString(); } else { ReturnResult = null; } } } red.Close(); Cmd.Dispose(); CloseConnect(); return ReturnResult; }
}
و هذا كود النموذج
PHP كود :
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace WindowsFormsApplication1 { public partial class TForm : Form { public TForm() { InitializeComponent(); }
DataTable TB_Content,TB_F ,TB_M = new DataTable(); string[] Fileds = null;
private void Cmb_F_SelectedIndexChanged(object sender, EventArgs e) { Fileds = new string[] {"Cont_ID","Cont_Title"}; TB_Content = Connect.SelectWithInteger("TB_Content", Fileds, "MF_ID", int.Parse(Cmb_F.SelectedValue.ToString() )); ListContent.DataSource = TB_Content; ListContent.DisplayMember = "Cont_Title"; ListContent.ValueMember = "Cont_ID"; }
private void ListContent_SelectedIndexChanged(object sender, EventArgs e) { if (!(ListContent.SelectedValue is DataRowView)) { richTextBox1.Text =Connect . GetFiled("Content", "TB_Content", "Cont_ID", ListContent.SelectedValue.ToString()); }
}
private void TForm_Load(object sender, EventArgs e) { Fileds = new string[] {"M_ID","M_Name"}; TB_M = Connect.SelectFTableNormal("TB_M", Fileds); Cmb_M.DataSource = TB_M; Cmb_M.DisplayMember = "M_Name"; }
private void Cmb_M_SelectedIndexChanged(object sender, EventArgs e) { Fileds = new string[] {"MF_ID", "F_Nmae"}; TB_F = Connect.SelectWithString("TB_MF", Fileds, "M_Nmae", Cmb_M.Text); Cmb_F.DataSource = TB_F; Cmb_F.DisplayMember = "F_Nmae"; Cmb_F.ValueMember = "MF_ID"; }
} }
و بالنسبة لرسالة الخطأ لو تكون بالانكليزي يكون احسن كوني لا افقه الفرنسية
بكل الاحوال جرب هذا و بعدها شوف اذا استمرت رسالة الخطأ بالظهور اخبرني (انا لم تظهر معي الرسالة)
RE: مساعدة في عمل برنامج تعليم - السرور - 16-11-16
الاخ عامل SetFileds.Count على شكل نص ويريد يطرح منه 1، كيف تصير!!!!
RE: مساعدة في عمل برنامج تعليم - شمس الدين 03 - 17-11-16
شكرا لك اخي ابو ليالي
اسف على تعبك معي
using System.Linq;
using System.Threading.Tasks;
يضهرلي خطأ بهد الكودين
RE: مساعدة في عمل برنامج تعليم - ابو ليلى - 17-11-16
ازلهم اخي انت لن تستخدم هذه المكتبات حاليا
و بالنسبة لرسالة الخطأ كما اشار الاخ السرور انتبه لما تكتبه و راجعه و اكتشف الخطأ بنفسك
RE: مساعدة في عمل برنامج تعليم - شمس الدين 03 - 17-11-16
شكرا لكم وفقكم الله وزادكم علما
ياتابع الكود جيداا
بارك الله فيكك اخي الو ليالي
واسف على تعبك معي
جواك الله خيرا
RE: مساعدة في عمل برنامج تعليم - شمس الدين 03 - 17-11-16
السلام عليكم
هذا المثال مرفق لم اتوصل لعرض القاعدة في البرنامج
تم العرض عند تغير مكان القاعدة ووضعخا بالدايفر c
public static string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\TestDb.accdb";
ادا كان عندي كتاب pdf على الشيكة اي على الانترنت
ووضعت الرابط الخاص به في الفاعدة كيف يمكن عرضه في البرنامج دون ان اقوم بتنزيله على الجخاز
RE: مساعدة في عمل برنامج تعليم - ابو ليلى - 18-11-16
لا تتوقع ان تجد لدي جواب لكل سؤال , انا ان احتجت لشيئ ابحث عنه و اتعلمه
حاول ان تبحث في الشبكة , و ستجد الكثير قبلك قد سأل هذا السؤال و ستجد الاجابة ان شاء الله
--------------------------
جرب المكتبة iTextSharp فيها ما يفيدك في التعامل مع ملفات Pdf
http://jadn.co.uk/w/ReadPdfUsingCsharp.htm
|