2016-02-16 8 views
7

मेरे पास 2 ग्रिडव्यू हैं। पहले ग्रिड में एक बटन होता है जब क्लिक किया जाता है, यह क्लिक किए गए बटन की आईडी के आधार पर डेटा के साथ एक दूसरी ग्रिड को पॉप्युलेट करेगा।किसी अन्य फ़ंक्शन से RowDataBound को कॉल करें

मेरे पास चयनित पंक्ति के आधार पर ग्रिड दिखाने के लिए RowDataBound फ़ंक्शन में कोड है। लेकिन समस्या यह है कि जनसंख्या फ़ंक्शन से पहले कोड स्वचालित रूप से RowDataBound चला रहा है। तो दूसरा ग्रिड प्रदर्शित नहीं हो रहा है।

GridView के लिए कोड:

<asp:GridView style="width:75%" 
         ID="gvCVRT" 
         ShowHeaderWhenEmpty="true" 
         CssClass="tblResults" 
         runat="server" 
         OnRowDataBound="gvCVRT_RowDataBound" 
         OnSelectedIndexChanged="gridviewParent_SelectedIndexChanged"       
         DataKeyField="ID" 
         DataKeyNames="ChecklistID" 
         AutoGenerateColumns="false" 
         allowpaging="false" 
         AlternatingRowStyle-BackColor="#EEEEEE"> 
         <HeaderStyle CssClass="tblResultsHeader" /> 
         <Columns> 
          <asp:BoundField DataField="ChecklistID" HeaderText="ID" ></asp:BoundField> 
          <asp:CommandField ShowSelectButton="True" HeaderText="Select" /> 
          <asp:BoundField DataField="ChecklistDate" HeaderText="Checklist Date" dataformatstring="{0:dd/MM/yyyy}"></asp:BoundField> 
          <asp:BoundField DataField="User" HeaderText="User" ></asp:BoundField> 
          <asp:BoundField DataField="Note" HeaderText="Note" ></asp:BoundField> 

         </Columns> 
        </asp:GridView> 

पीछे कोड: चयन करें बटन के लिए

protected void gvCVRT_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     lookupCVRT work = (lookupCVRT)e.Row.DataItem; 
     GridView gv = sender as GridView; 

     if (work.ID != null) 
     { 
      int index = gv.Columns.HeaderIndex("Select"); 
      if (index > -1) 
      { 
       e.Row.Cells[index].Attributes.Add("class", "gvCVRTRow"); 
       e.Row.Cells[index].ToolTip = "Click here to Edit Checklist"; 
      } 
     } 
    } 
} 

कोड:

protected void gridviewParent_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    List<lookupCVRT> workDetails = lookupCVRT.GetChecklistItemsByChecklistID(Company.Current.CompanyID, ParentID.ToString(), gvCVRT.SelectedDataKey.Value.ToString()); 
    gvCVRTDetails.DataSource = workDetails; 
    gvCVRTDetails.DataBind(); 
    FireJavascriptCallback("setArgAndPostBack();"); 
} 

तो समस्या है जब मैं में चयनित करें बटन पर क्लिक करें ग्रिड यह RowDataBound पहले gridviewParent_SelectedIndexChanged चलाता है लेकिन मुझे 012 चलाने की आवश्यकता है पहले। क्या मैं gridviewParent_SelectedIndexChanged से RowDataBound फ़ंक्शन को कॉल कर सकता हूं?

Page_Load समारोह:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      GetChecklistID = ""; 
      if (ParentID.HasValue) 
      { 
       ViewState["ParentID"] = ParentID; 

       List<lookupCVRT> work = lookupCVRT.GetCVRTItems(Company.Current.CompanyID, ParentID.ToString()); 
       ViewState["CVRT"] = work; 
       gvCVRT.DataSource = work; 
       gvCVRT.DataBind(); 

      } 
     } 
     else 
     { 
      if (ViewState["ParentID"] != null) 
      { 
       ParentID = (int?)ViewState["ParentID"]; 
       List<lookupCVRT> work = ViewState["CVRT"] as List<lookupCVRT>; 
       gvCVRT.DataSource = work; 
       gvCVRT.DataBind(); 

      } 
     } 
    } 
+0

आप अपने Page_Load विधि और अन्य सभी तरीकों कि DataBind को गिरावट को रोकने के() पोस्ट कृपया कर सकते हैं? – Markus

+0

@ मार्कस मेरे प्रश्न में पेज_ लोड कोड जोड़ें। यह डाटाबेस को एकमात्र जगह कहा जाता है। जब मैं चयन पर क्लिक करता हूं तो यह विधि – user123456789

+0

विधि के 'अन्य' भाग में जाता है; मुझे लगता है कि मैंने समस्या की पहचान की है; कृपया मेरा अद्यतन उत्तर देखें। – Markus

उत्तर

1

OnRowDataBound घटना केवल बुलाया अगर GridView के लिए DataBind विधि बुलाया गया है है।

अपने विशिष्ट मामले में, समस्या Page.IsPostBack हालत के else शाखा में Page_Load में है:

else 
{ 
    if (ViewState["ParentID"] != null) 
    { 
     ParentID = (int?)ViewState["ParentID"]; 
     List<lookupCVRT> work = ViewState["CVRT"] as List<lookupCVRT>; 
     gvCVRT.DataSource = work; 
     gvCVRT.DataBind(); 

    } 
} 

इस कोड को प्रत्येक पोस्टबैक के लिए चलाया जाता है। जब तक आप अपने कोड में कहीं और ViewState["ParentID"] रीसेट नहीं करते हैं, तो प्रत्येक पोस्टबैक पर आप फिर से ग्रिड व्यू gvCVRT को बाध्य करते हैं। यही कारण है कि RowDataBound कहा जाता है। Page_Load को समाप्त करने के बाद, पृष्ठ आपके ईवेंट gridviewParent_SelectedIndexChanged में अतिरिक्त ईवेंट हैंडलर को कॉल करता है।

इस समस्या को हल करने के लिए, आप तो यह है कि वहाँ एक पोस्टबैक के लिए DataBind करने के लिए कोई कॉल कर रहे हैं अपने Page_Load हैंडलर में कोड को बदलने की जरूरत:

// field moved to class level so that you can access this variable instead of a DataRow in gvCVRT 
private List<lookupCVRT> work; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     GetChecklistID = ""; 
     if (ParentID.HasValue) 
     { 
      ViewState["ParentID"] = ParentID; 

      work = lookupCVRT.GetCVRTItems(Company.Current.CompanyID, ParentID.ToString()); 
      ViewState["CVRT"] = work; 
      gvCVRT.DataSource = work; 
      gvCVRT.DataBind(); 

     } 
    } 
    else 
    { 
     if (ViewState["ParentID"] != null) 
     { 
      ParentID = (int?)ViewState["ParentID"]; 
      work = ViewState["CVRT"] as List<lookupCVRT>; 
     } 
    } 
} 

आपकी समस्या का मूल कारण है कि आप की जरूरत है एक पोस्टबैक अनुरोध में डेटा और आप डेटा को फिर से अनुरोध करने के बजाय इन्हें ViewState["CVRT"] में डाल दें। वेब अनुप्रयोगों में यह एक नए अनुरोध के लिए डेटा को फिर से पढ़ना बहुत आम है। तो आप इस बारे में सोच सकते हैं कि आपको वास्तव में डेटा को व्यूस्टेट में रखना है या आप डेटा स्रोत से पोस्टबैक पर अनुरोध कर सकते हैं या नहीं।

डेटा को व्यूस्टेट में डालकर क्लाइंट को स्थानांतरित किए गए पृष्ठ का आकार बढ़ जाता है (मूल रूप से आपके पास ग्रिड व्यू के लिए HTML है और इसके अतिरिक्त आपके पास व्यूस्टेट में डेटा है)। इसलिए उन्हें फिर से अनुरोध करना ज्यादातर मामलों में बेहतर तरीका होगा।

+0

लेकिन चुनिंदा क्लिक होने पर 'ग्रिडव्यू' बाध्य हो जाता है, क्योंकि मुझे चयनित पंक्ति से आईडी प्राप्त करने की आवश्यकता है: 'gvCVRT.SelectedDataKey.Value.ToString() '। मैं पेज_लोड से ऐसा नहीं कर सकता क्योंकि मेरे पास अभी तक आईडी नहीं है। – user123456789

+0

@ user123456789: हाँ, मैं समझता हूं। मैंने फिर से आपका प्रश्न पढ़ लिया है और मैं नियंत्रण और ईवेंट हैंडलर के नाम से अधिक से अधिक उलझन में हूं। स्पष्टीकरण के लिए: आपके पास ग्रिड व्यू 'जीवीसीवीआरटी' है जो ईवेंट हैंडलर' ग्रिडव्यू पेरेंट_SelectedIndexChanged' और 'gvCVRT_RowDataBound' वाला अभिभावक है। फिर एक बच्चा ग्रिड व्यू 'gvCVRTDetails' है, लेकिन प्रश्न में बच्चे ग्रिड व्यू के लिए इवेंट हैंडलर का उल्लेख नहीं है। 'RowDataBound' के साथ आपका मतलब है 'gvCVRT_RowDataBound' या बच्चे ग्रिड व्यू के लिए हैंडलर? – Markus

+0

@ user123456789: हालांकि, 'RowDataBound' केवल 'डेटाबिंड' पर कॉल के बाद चलाया जाता है। तो यह आपके कोड में 'डेटाबिंड' को सभी कॉलों की जांच करने के लिए एक अच्छा कदम होगा और यदि वे सही जगह पर हैं। यदि उदाहरण के लिए अभिभावक ग्रिड व्यू 'पेज_लोड' में डेटा-बाउंड है, तो इसका 'gvCVRT_RowDataBound'' ग्रिडव्यू पेरेंट_SelectedIndexChanged' से पहले चलाया जाएगा और अधिकतर चयन को नष्ट कर देगा। – Markus

0

मुझे नहीं पता कि आपने gridviewParent_SelectedIndexChanged का उपयोग क्यों करना पसंद किया है तो grdParent_RowDataBound ... मैंने आपके लिए एक सरल समाधान बनाया है .. यह आपकी मदद कर सकता है ..

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <div> 
     <label>Parent Grid</label> 
     <asp:GridView ID="grdParent" runat="server" AutoGenerateColumns="false" 
      DataKeyField="Id" OnRowDataBound="grdParent_RowDataBound" OnRowCommand="grdParent_RowCommand"> 
      <Columns> 
       <asp:BoundField DataField="Name" HeaderText="Name" />     
       <asp:ButtonField CommandName="Details" HeaderText="Select" Text="Hello" ButtonType="Link" /> 
      </Columns> 
     </asp:GridView> 
    </div> 
    <div> 
     <label>child Grid</label> 
     <asp:GridView ID="grdChild" runat="server" AutoGenerateColumns="false" 
      DataKeyNames="ChildId" OnRowDataBound="grdChild_RowDataBound"> 
      <Columns> 
       <asp:BoundField DataField="Name" /> 
       <asp:BoundField DataField="Roll" />     
       <asp:ImageField HeaderText="Image" /> 
      </Columns> 
     </asp:GridView> 
    </div> 
    </div> 
    </form> 
</body> 
</html> 

codebehind

public partial class Default2 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      List<ParentClass> pList = new List<ParentClass>() 
      { 
       new ParentClass{Id=5, Name="V"}, 
       new ParentClass{Id=6,Name="VI"}, 
       new ParentClass{Id=7,Name="VII"}, 
       new ParentClass{Id=8,Name="VIII"}, 
       new ParentClass{Id=9,Name="IX"}, 
       new ParentClass{Id=10,Name="X"}, 
      }; 

      grdParent.DataSource = pList; 
      grdParent.DataBind(); 
     } 
    } 

    protected void grdParent_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.DataItem == null || e.Row.RowType != DataControlRowType.DataRow) 
     { 
      return; 
     } 

     ParentClass p = e.Row.DataItem as ParentClass; 

     var btn = e.Row.Cells[1].Controls[0] as LinkButton; 
     btn.CommandArgument = p.Id.ToString(); 
    } 

    protected void grdParent_RowCommand(object sender, GridViewCommandEventArgs e) 
    { 
     int parentId = Convert.ToInt32(e.CommandArgument); 

     var releventStudents = GetRepositary().FindAll(i => i.ParentId == parentId); 

     grdChild.DataSource = releventStudents; 
     grdChild.DataBind(); 

    } 

    protected void grdChild_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.DataItem == null || e.Row.RowType != DataControlRowType.DataRow) 
     { 
      return; 
     } 

     //lookupCVRT work = (lookupCVRT)e.Row.DataItem; 
     //GridView gv = sender as GridView; 

     //if (work.ID != null) 
     //{ 
     // int index = gv.Columns.HeaderIndex("Select"); 
     // if (index > -1) 
     // { 
     //  e.Row.Cells[index].Attributes.Add("class", "gvCVRTRow"); 
     //  e.Row.Cells[index].ToolTip = "Click here to Edit Checklist"; 
     // } 
     //}   
    } 

    private List<ChildClass> GetRepositary() 
    { 
     List<ChildClass> allChild = new List<ChildClass>(); 
     Random r = new Random(); 

     for (int i = 0; i < 50; i++) 
     { 
      ChildClass c = new ChildClass 
      { 
       ChildId = i, 
       ParentId = r.Next(5, 10), 
       Name = "Child Name " + i, 
       Roll = i 
      }; 

      allChild.Add(c); 
     } 

     return allChild; 
    } 
} 

public class ParentClass 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class ChildClass 
{ 
    public int ParentId { get; set; } 
    public int ChildId { get; set; } 
    public int Roll { get; set; } 
    public string Name { get; set; } 
} 
संबंधित मुद्दे