• 0
newbie

paging child datagrid

سؤال

اخوني الكرام

لدي مشكلة في عملية ال paging

هناك DataGrid1 وهي الرئيسية واخرى DaaGrid2 فرعية

اريد ان اعمل paging للفرعية

هناك علاقة DataRelation بينهما

هذا بعض الكود حتى لا تخطلط الامور ويفهم انني اعمل sqlQuery في كل مرة

private void DataGrid1_SelectedIndexChanged(object sender, System.EventArgs e)
 {
   

  if(DataGrid1.SelectedIndex != -1)
  {
   
   DataRow[] ChildRows = ds.Tables["mainTable"].Rows[DataGrid1.SelectedIndex].GetChildRows("myrelation");

   foreach(DataRow i in ChildRows)
   {
    dr = dt.NewRow();
    dr.ItemArray=i.ItemArray;
    dt.Rows.Add(dr);
   }


   DataView dv = new DataView(dt);
   DataGrid2.DataSource = dv;  
   DataGrid2.AllowPaging=true;
   DataGrid2.DataBind();
   DataGrid2.Visible=true;
 
  }
  }

حاولت بالطريقة العادية ولم افلح مع ال custom paging

تم تعديل بواسطه newbie
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

6 إجابة على هذا السؤال .

  • 0

ما دام انك تعتمد على DataGrid1.SelectedIndex لمعرفة السجل الرئيسي ثم الاتيان بالسجلات الفرعية فضع هذه القيمة في ال ViewState

ViewState["parentId"] = DataGrid1.SelectedIndex;

ثم قم باضافة ال Event Handler الخاص بال paging في الGrid الفرعية :اي للحدث PageIndexChanged .استعمل نفس الكود ما عدا ان ال DataGrid1.SelectedIndex سيتغير الى:

 int.ParseInt(ViewState["parentId"] .ToString())

طبعا يجب ايضا اعطاء القيمة الاخصة بالصفحة الحالية للGrid الفرعية

MyChildGrid.CurrentPageIndex = e.NewPageIndex;

تحياتي

مدني

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا مدني

لم اعرف كيف اجرب طريقتك ولكن فهمت منها انها متعلقة بحفظ DataGrid1.SelectedIndex

وبدا لى ان المشكلة من Datagid2 التي فيها مشكلة في حساب Pagesize و CurrentPageIndex

وتعطي هذا الخطأ :

Invalid CurrentPageIndex value. It must be >= 0 and < the PageCount

عملت صفحة مشابهة للتي اعمل عليها

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace arabteam
{

public class pubs : System.Web.UI.Page
{
 protected DataSet ds=new DataSet();
 protected DataTable dt = new DataTable();
 protected DataRow dr;
 protected System.Web.UI.WebControls.DataGrid DataGrid1;
 protected System.Web.UI.WebControls.DataGrid DataGrid2;
 protected System.Web.UI.WebControls.Label Label1;

 private void Page_Load(object sender, System.EventArgs e)
 {
 if (!IsPostBack)
 {
   
   DataGrid2.CurrentPageIndex=0;
   
 }

 
 
 // Put user code to initialize the page here
 SqlConnection con= new SqlConnection( "integrated security=SSPI;data source=loca" +
   "lhost;persist security info=False;initial catalog=northwind");
 SqlDataAdapter da1 = new SqlDataAdapter("SELECT * FROM Categories", con);
 SqlDataAdapter da2 = new SqlDataAdapter( "SELECT ProductID ,ProductName ,SupplierID,CategoryID FROM Products", con);
 
 //DataSet ds1=new DataSet();
 
 try
 {
   da1.Fill(ds,"Categories");
   da2.Fill(ds,"Products");
   //fill dataset
   DataGrid1.DataSource=ds;
   DataGrid1.DataMember="Categories";
   DataGrid1.DataBind();

   ds.Relations.Add("myrelation",
   ds.Tables["Categories"].Columns["CategoryID"],
   ds.Tables["Products"].Columns["CategoryID"]);
 
 }
 
 catch(Exception ex)
 {
   Label1.Visible=true;
   
   Label1.Text = "connection failure: " + ex;
 }
 
 


 //add columns to child table;  
 dt.Columns.Add(new DataColumn("ProductID", typeof(String)));    
 dt.Columns.Add(new DataColumn("ProductName", typeof(String)));
 dt.Columns.Add(new DataColumn("SupplierID", typeof(String)));
 dt.Columns.Add(new DataColumn("CategoryID", typeof(String)));
 

 }
 


 
 private void DataGrid1_SelectedIndexChanged(object sender, System.EventArgs e)
 {
   
 
 if(DataGrid1.SelectedIndex != -1)
 {
     
   DataRow[] ChildRows = ds.Tables["Categories"].Rows[DataGrid1.SelectedIndex].GetChildRows("myrelation");

   foreach(DataRow i in ChildRows)
   {
   dr = dt.NewRow();
   dr.ItemArray=i.ItemArray;
   dt.Rows.Add(dr);
   }

   DataView dv = new DataView(dt);
   DataGrid2.DataSource = dv;
 
   DataGrid2.DataBind();
   
 }
 
 
 }
 #region Web Form Designer generated code
 override protected void OnInit(EventArgs e)
 {
 //
 // CODEGEN: This call is required by the ASP.NET Web Form Designer.
 //
 InitializeComponent();
 base.OnInit(e);
 }
 
 /// <summary>
 /// Required method for Designer support - do not modify
 /// the contents of this method with the code editor.
 /// </summary>
 private void InitializeComponent()
 {    
 this.DataGrid2.SelectedIndexChanged += new System.EventHandler(this.DataGrid2_SelectedIndexChanged);
 this.DataGrid1.SelectedIndexChanged += new System.EventHandler(this.DataGrid1_SelectedIndexChanged);
 this.Load += new System.EventHandler(this.Page_Load);

 }
 #endregion

 private void DataGrid2_SelectedIndexChanged(object sender, System.EventArgs e)
 {
 
 }

 
 
 //DataGrid Paging
 public void DataGrid_Page(object sender, DataGridPageChangedEventArgs e)
 {
 
 DataGrid2.CurrentPageIndex = e.NewPageIndex;

 DataView dv = new DataView(dt);
 DataGrid2.DataSource = dv;
 DataGrid2.DataBind();
 
 

 }
}
}

asp

<form id="Form1" method="post" runat="server">
 <asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 8px" runat="server">Label</asp:Label>
 <asp:DataGrid id="DataGrid1" style="Z-INDEX: 102; LEFT: 24px; POSITION: absolute; TOP: 40px" runat="server"
   AutoGenerateColumns="False" PageSize="4">
   <Columns>
   <asp:BoundColumn DataField="CategoryID"></asp:BoundColumn>
   <asp:ButtonColumn DataTextField="CategoryName" CommandName="Select"></asp:ButtonColumn>
   </Columns>
 </asp:DataGrid>
 <asp:DataGrid id="DataGrid2" style="Z-INDEX: 103; LEFT: 184px; POSITION: absolute; TOP: 40px"
   runat="server" PageSize="2" AllowPaging="True" OnPageIndexChanged="DataGrid_Page"></asp:DataGrid>
 </form>

تم تعديل بواسطه newbie
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

قبل هذه المرة كنت عملت روتين

 void bind()
{
     
DataGrid3.DataSource = dt;
DataGrid3.DataBind();    
}

خاص بإعادة تحميل الجدول واشرت فقط الى ال

DataGrid_Page()

وان كان فيه اعادة تحميل للجدول

المشكلة يبدو ان ال Datagrid عندها مشكلة مراجعة حسابات وكما اشار اخي مدني تحاول ان تحكم على الوضع من خلال ViewState الذي لم يوافق ذكاءه الكبير ذكائي المحدود فحدث عدم تناغم وقل مقدار محبتي له وللدوت نيت ,,, المهم ان حليمة عادت الى حالتها القديمة ,,, ولأقطع الشك باليقين وضعت في روتين bind الأمور كاملة بدلا من الإقتصار على DataGrid2.DataBind() فاصبحت الأمور كما يلى

 void bind()
 {
 
  DataRow[] ChildRows = ds.Tables["Categories"].Rows[DataGrid1.SelectedIndex].GetChildRows("myrelation");

  foreach(DataRow i in ChildRows)
  {
   dr = dt.NewRow();
   dr.ItemArray=i.ItemArray;
   dt.Rows.Add(dr);
  }

   
  DataGrid2.DataSource = dt;
 
  DataGrid2.DataBind();    
 

}

وكأنه يفرق بين ان يكون الجدول مرتبط مباشرة ب DataSet او مرتبط ب DataTable

وارجو من كان عنده طريقة افضل ان يتحفنا بها

شكرا لك اخي مدني فقد قمت بتحويل كل شئ من حدث DataGrid1_SelectedIndexChanged

ولم اترك فيها غير اشارة الى روتين bind() ,,, هل رأيت كيف يعمى الواحد عن ابسط واقرب شئ

تم تعديل بواسطه newbie
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لدي ملاحطتين على الكود

أولا أنه ليس عليك نسخ ال DataRow من جدول على آخر بهذه الطريقة المتعبة ف GetChildRows تعيد كائنا من النوع DataRow[] تستطيع فورا أن تضعه ك DataSource للداتا غريد

ثانيا انك تقوم بانشاء dt جديد في كل مرة تقوم الصفحة بعمل PostBack وتقوم بملأ هذه هذا الحدول مرة واحد فقط عندما يحدث الحدث DataGrid1_SelectedIndexChanged اي ان ما تقوم بربطه بالداتا غريد عند حدوث الحدث DataGrid_Page هو جدول فارغ

لحل هذه المشكلة فم بحفظ ال dt في السشن بعد أن تملاها في البيانات ضمن حدث DataGrid1_SelectedIndexChanged عن طريق

Session["myTable"] = dt;

وعندما تردي استدعائها قم بعمل ما يلي

DataTable newDT = (DataTable)Session["myTable"];
if (newDT != null)
{
DataView dv = new DataView(dt);
 DataGrid2.DataSource = dv;
 DataGrid2.DataBind();
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي DotNetExpert ,,, حل جيد لحالتي ,,, شكرا لك ,,, الآن فقط عرفت انني من الشق الأول في توقيعك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .