2016-02-16 25 views
7

2 Gridviews'ım var. İlk ızgarada tıklandığında, tıklatılan düğmenin kimliğine dayanan verilerle ikinci bir ızgara dolduracak bir düğme vardır.Başka bir işlevden RowDataBound çağrısı

Ardından, seçilen satıra göre ızgarayı göstermek için RowDataBound işlevinde kodum var. Ancak sorun, kodun populate işlevinden önce otomatik olarak RowDataBound'u çalıştırmasıdır. Yani ikinci ızgara görüntülenmiyor. GridView

Kodu: arkasında

<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> 

Kod: select düğme için

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"; 
      } 
     } 
    } 
} 

Kodu: Ben Seç düğmesini tıkladığında

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();"); 
} 

Yani sorundur izgaraönce gridviewParent_SelectedIndexChanged çalışır ama ben 012 çalıştırmak gerekir İlk önce. gridviewParent_SelectedIndexChanged'dan RowDataBound işlevini çağırabilir miyim?

Page_Load fonksiyonu: GridView için DataBind yöntemi olarak adlandırılan olması durumunda

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

Eğer Page_Load yöntem ve DataBind bir düşüş içeren tüm diğer yöntemleri() gönderebilir misiniz? – Markus

+0

@Markus, sorumu Page_Load kodumu soruna ekleyin. DataBind'in çağrıldığı tek yer burası. Seçimi tıkladığımda, – user123456789

+0

metodunun 'else' bölümüne gider; Sanırım problemi tanımladım; lütfen güncellenmiş cevabımı görün. – Markus

cevap

1

OnRowDataBound etkinlik yalnızca adlandırılır. Belirli bir durumda

, sorun Page.IsPostBack durumun else dalında Page_Load içinde:

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

    } 
} 

Bu kod her postback için çalıştırılır. Kodunuzda ViewState["ParentID"]'u sıfırlamadığınız sürece, her geri yüklemede GridView gvCVRT'u tekrar bağlarsınız. Bu, RowDataBound'un çağrılmasının sebebidir. Page_Load'u bitirdikten sonra, sayfa gridviewParent_SelectedIndexChanged örneğinde ek olay işleyicilerini çağırır.

Bu sorunu çözmek için, bir geri gönderme için DataBind için hiçbir aramalar böylece Page_Load işleyicisindeki kodunu değiştirmek gerekir:

// 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>; 
     } 
    } 
} 

senin sorunun altında yatan neden ihtiyacınız olduğunu Bir geri gönderme isteğindeki veriler ve verileri yeniden talep etmek yerine bunları ViewState["CVRT"] içine koydunuz. Web uygulamalarında, yeni bir istek için verileri tekrar okuman oldukça yaygındır. Bu nedenle, verileri gerçekten ViewState'e koymanız gerekip gerekmediğini veya veri kaynağından bir geri gönderme yaparak bunları isteyip istemediğinizi düşünebilirsiniz.

Verileri ViewState'e koymak, istemciye aktarılan sayfanın boyutunu artırır (temel olarak GridView için HTML'ye sahip olursunuz ve buna ek olarak, verileri ViewState'e eklersiniz). Bu yüzden onları yeniden talep etmek çoğu durumda daha iyi bir yol olurdu.

+0

Ama 'Gridview' seçeneği tıklandığında sınırlanır. Çünkü kimliği seçilen satırdan almam gerekiyor: 'gvCVRT.SelectedDataKey.Value.ToString()'. Bunu henüz ID'ye sahip olmadığım için page_load dosyasından yapamam. – user123456789

+0

@ user123456789: Evet, bunu anlıyorum. Sorunuzu tekrar okudum ve kontrollerin ve olay işleyicilerinin isimleriyle daha da karmaşıklaşıyorum. Açıklamak gerekirse: olay işleyicileri gridviewParent_SelectedIndexChanged ve gvCVRT_RowDataBound ile ebeveyn olan GridView 'gvCVRT 'var. Sonra GridView 'gvCVRTDetails' bir çocuk var, ancak soru GridView için olay işleyicileri bahsetti. 'RowDataBound' ile 'gvCVRT_RowDataBound' veya GridView için bir işleyici kastediyorsunuz? – Markus

+0

@ user123456789: 'RowDataBound' yalnızca 'DataBind' çağrısından sonra çalışır. Bu nedenle, kodunuzdaki tüm DataBind çağrılarını kontrol etmek ve doğru yerde olmanız iyi bir adım olacaktır. Örneğin GridView ebegümesi, Page_Load'da veriye bağlıysa, gvCVRT_RowDataBound, 'gridviewParent_SelectedIndexChanged''den önce çalışır ve büyük olasılıkla seçimi yok eder. – Markus

0

Neden gridviewParent_SelectedIndexChanged'u grdParent_RowDataBound kullanmayı tercih ettiğinizi bilmiyorum ... sizin için basit bir çözüm oluşturdum .. size yardımcı olabilir ..

<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; } 
} 
İlgili konular