2011-11-08 3 views
1

私は、データベースから来るデータによってリピーターバインドを持っています。今すぐ行のクリックで詳細な情報の別のリピーターをバインドしたい。 もう1つはネストされていません。 OK例を挙げて説明しますが、私はクラスのリピーターを持っています。このリピーターはschool.Now内のすべてのクラスに関するバインディング情報を持っています。特定のクラスの詳細情報を得るために別のRepeaterがあります。クラスのリストで特定のクラスをクリックすると、詳細情報が表示されます。クラスid。別のリピータの行をクリックしてリピータをバインドする方法はありますか?

答えて

1

Ok ..あなたがクリックした行の特定のIDを知っています。クリックイベントでIDを取得し、ストアドプロシージャに渡すか、これまでにリピータにバインドしています。

<asp:Repeater ID="repGrd" runat="server"> 
<ItemTemplate>  
      <asp:LinkButton ID="lnkbtn" Runat="server" RowID='<%#DataBinder.Eval(Container.DataItem,"ID")%>' OnCommand="clickbutton">Click Here</asp:LinkButton> 
</ItemTemplate> 
</asp:Repeater> 

と後ろのコードはこのように書きます。..

#region On click of row binding repeater 
    public void clickbutton(Object sender,CommandEventArgs e) 
    { 
    try 
    { 
      //Getting the ID of clicked row 
      string RowIDval=((LinkButton)sender).Attributes["RowID"].ToString().Trim(); 

     // Write your code here to bind the repeater as you got the ID 
    } 
    catch(Exception ex) 
    { 

    } 
    } 
    #endregion 

これを試してみてください。

+1

あなたがLinkBut​​tonコントロールのCommandArgument属性を使用している場合、それは次のようになりますIDの取得が容易 –

0

私は、これはあなたが探しているものだと思う:

クラスに関する拡張情報を表示するユーザーコントロールを。クラスエンティティのコレクションにバインドするリピーターを持つWebフォーム。リピーターのItemTemplateは、一般クラス情報のヘッダーと、Visibilityをfalseに設定して作成したUserControlのインスタンスで構成されています。ユーザーが詳細を見たいかどうかによって、このUCをオン/オフにします。

一部コード:

エンティティ

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

public class ClassDetails : Class 
{ 
    public int NumberOfWeeks 
    { 
     get 
     { 
      return this.Id; 
     } 
    } 
} 

ClassDetailsユーザーコントロール

(ASPX)

<hr /> 
Class Details:<br /> 
Number of Weeks: <asp:Label ID="lblNumWeeks" runat="server" /> 
<hr /> 

(コードBEH IND)

public void Populate(ClassDetails classDetails) 
{ 
    this.lblNumWeeks.Text = classDetails.NumberOfWeeks.ToString(); 
} 

Webフォーム

(ASPX)

<%@ Register Src="~/ClassDetailsUC.ascx" TagPrefix="SO" TagName="ClassDetailsUC" %> 
<asp:Repeater ID="rptClassList" runat="server"> 
    <HeaderTemplate> 
     <table> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <tr> 
      <td> 
       <asp:Label ID="lblClassName" runat="server" /> 
       <asp:Button ID="btnShow" runat="server" /> 
       <asp:Panel ID="pnlDetails" Visible="false" runat="server"> 
        <br /> 
        <SO:ClassDetailsUC ID="ucClassDetails" runat="server" /> 
       </asp:Panel> 
      </td> 
     </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
     </table> 
    </FooterTemplate> 
</asp:Repeater> 

(ファイル.csファイル)

/// <summary> 
/// Page-level collection of Class instances 
/// </summary> 
List<ClassDetails> classes; 

/// <summary> 
/// The current class id we are displaying extended information for 
/// </summary> 
private int? ActiveId 
{ 
    get 
    { 
     if (this.ViewState["ClassIdDetails"] == null) 
     { 
      return null; 
     } 
     else 
     { 
      return (int?)this.ViewState["ClassIdDetails"]; 
     } 
    } 
    set 
    { 
     this.ViewState["ClassIdDetails"] = value; 
    } 
} 

protected override void OnInit(EventArgs e) 
{ 
    this.rptClassList.ItemDataBound += new RepeaterItemEventHandler(rptClassList_ItemDataBound); 
    this.rptClassList.ItemCommand += new RepeaterCommandEventHandler(rptClassList_ItemCommand); 
    base.OnInit(e); 
} 

void rptClassList_ItemCommand(object source, RepeaterCommandEventArgs e) 
{ 
    //for now we know this is the only button on the repeater. so no need to check CommandType 
    //set new ActiveId 
    this.ActiveId = Convert.ToInt32(e.CommandArgument); 
    //re-bind repeater to refresh data 
    this.BindData(); 
} 


/// <summary> 
/// For each Class entity bound, we display some basic info. 
/// <para>We also check to see if the current Class is the ActiveId. If it is, turn on the detail panel and populate the ClassDetailsUC</para> 
/// </summary> 
/// <param name="sender"></param> 
/// <param name="e"></param> 
void rptClassList_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     Class classItem = (Class)e.Item.DataItem; 
     ((Label)e.Item.FindControl("lblClassName")).Text = classItem.Name; 
     ((Button)e.Item.FindControl("btnShow")).CommandArgument = classItem.Id.ToString(); 
     if (this.ActiveId.HasValue && this.ActiveId == classItem.Id) 
     { 
      //we want to display details for this class 
      ((Panel)e.Item.FindControl("pnlDetails")).Visible = true; 
      //get ClassDetails instance 
      ClassDetails details = this.RetrieveDetails(classItem.Id); 
      //populate uc 
      ((ClassDetailsUC)e.Item.FindControl("ucClassDetails")).Populate(details); 

     } 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    //quick data retrieval process :) 
    classes = new List<ClassDetails> { 
     new ClassDetails() { Id = 1, Name = "Class 1" }, 
     new ClassDetails() { Id = 2, Name = "Class 2" }, 
     new ClassDetails() { Id = 3, Name = "Class 3" } 
    }; 

    if (!this.IsPostBack) 
    { 
     //only bind on initial load 
     this.BindData(); 
    } 
} 

private void BindData() 
{ 
    this.rptClassList.DataSource = this.classes; 
    this.rptClassList.DataBind(); 
} 

/// <summary> 
/// Quick function to simulate retrieving a single ClassDetails instance 
/// </summary> 
/// <param name="id"></param> 
/// <returns></returns> 
private ClassDetails RetrieveDetails(int id) 
{ 
    return this.classes.Where(c => c.Id == id).Single(); 
} 
関連する問題