تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Custom Datagridview Paging
#1
السلام عليكم 

أحاول عمل نظام الصفحات مطور وسلس ل Datagridview ، لقد قمت بالفعل بعمل ذلك وهو يعمل بشكل جيد ، لكن المشكلة هي عندما أحاول البحث عن سجلات من قاعدة البيانات ، المشكلة هي أن Datagridview لا تقوم بعرض البيانات التي يتم إرجاعها من قاعدة البيانات عند عملية البحث.
احتاج بعض الاقتراحات أو مشاركة فكرة جديدة لتحقيق المطلوب أو المساعدة في المشكلة الحالية.

هنا فيديو يوضح المشكلة :





و هنا الكود المستخدم :

custom datagridview class :

كود :
class GV_Paging : Guna.UI2.WinForms.Guna2DataGridView
   {
       public int PageSize
       {
           get
           {
               return _pageSize;
           }
           set
           {
               _pageSize = value;
           }
       }

       public int _pageSize = 10;
       BindingSource bs = new BindingSource();
       BindingList<DataTable> tables = new BindingList<DataTable>();
       public void SetPagedDataSource(DataTable dataTable, BindingNavigator bnav)
       {
           DataTable dt = null;
           int counter = 1;
           foreach (DataRow dr in dataTable.Rows)
           {
               if (counter == 1)
               {
                   dt = dataTable.Clone();
                   tables.Add(dt);
               }
               dt.Rows.Add(dr.ItemArray);
               if (PageSize < ++counter)
               {
                   counter = 1;
               }
           }
           bnav.BindingSource = bs;
           bs.DataSource = tables;
           bs.PositionChanged += Bs_PositionChanged;
           Bs_PositionChanged(bs, EventArgs.Empty);
       }
       void Bs_PositionChanged(object sender, EventArgs e)
       {
           this.DataSource = tables[bs.Position];
       }
   }
طريقة تعبئة البيانات في ال Datagridview:
كود :
// set the page row count size automatically
           GV.PageSize = Convert.ToInt32(Math.Floor(Convert.ToDecimal(GV.Height / GV.RowTemplate.Height))) - 1;
           DT = DBConn.ExecuteDataTable("select_all_materials", CommandType.StoredProcedure);
           GV.SetPagedDataSource(DT, bindingNavigator1);

الكود الخاص بعمية البحث: 
كود :
GV.PageSize = Convert.ToInt32(Math.Floor(Convert.ToDecimal(GV.Height / GV.RowTemplate.Height))) - 1;
DT = DBConn.ExecuteDataTable("search_materials_by_category_name", CommandType.StoredProcedure, new SqlParameter[] { new SqlParameter("@name", Categorys_comb.Text) });
           GV.SetPagedDataSource(DT, bindingNavigator1);
وهنا الكود الخاص بال Datatable

كود :
public static DataTable ExecuteDataTable(string sql, CommandType cmdType, params SqlParameter[] parameters)
       {
           using (DataTable dt = new DataTable())
           using (SqlConnection connStr = new SqlConnection(ConnectionString))
           using (SqlCommand cmd = new SqlCommand(sql, connStr))
           {
               cmd.CommandType = cmdType;
               cmd.Parameters.AddRange(parameters);              
               try
               {
                   cmd.Connection.Open();
                   new SqlDataAdapter(cmd).Fill(dt);
               }
               catch (SqlException ex)
               {
                   //log to a file or Throw a message ex.Message;
                   MessageBox.Show("Error: " + ex.Message);
               }
               return dt;
           }
       }
المشكلة كما موضح في الفيديو انة لا يتم جلب البيانات بنائا على نتائج البحث
مع العلم ان النتائج المرجعة صحيحة و تظهر في عدد الاسطر و تظهر في نتائج 
الطباعة كما موضح بالقيديو لكن لا تضهر في الـ Datagridview

الرد }}}
تم الشكر بواسطة: ابراهيم ايبو , Ronald
#2
بعد العمل على المشكلة  تم حلها و الحمد للة 
تم تحديث الـ class

كود :
public int PageSize
{
   get
   {
       return _pageSize;
   }
   set
   {
       _pageSize = value;
   }
}
public int _pageSize = 10;
BindingSource bs;//= new BindingSource();
BindingList<DataTable> tables;// = new BindingList<DataTable>();
public void SetPagedDataSource(DataTable dataTable, BindingNavigator bnav)
{
   if (dataTable == null || bnav == null)
   {
       return;
   }

   DataTable dt = null;
   bs = new BindingSource();
   tables = new BindingList<DataTable>();
   int counter = 1;

   foreach (DataRow dr in dataTable.Rows)
   {
       if (counter == 1)
       {
           dt = dataTable.Clone();
           tables.Add(dt);
       }

       dt.Rows.Add(dr.ItemArray);
       if (PageSize < ++counter)
       {
           counter = 1;
       }
   }
   bnav.BindingSource = bs;
   bs.DataSource = tables;
   bs.PositionChanged += Bs_PositionChanged;
   Bs_PositionChanged(bs, EventArgs.Empty);
}
void Bs_PositionChanged(object sender, EventArgs e)
{
   try
   {
       this.DataSource = tables[bs.Position];
   }
   catch (Exception ex)
   {

       MessageBox.Show(ex.Message);
   }
}


الرد }}}
تم الشكر بواسطة: ابراهيم ايبو , Ronald , asemshahen5



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


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