Asp.net 如何在单击另一中继器的行时绑定中继器?

Asp.net 如何在单击另一中继器的行时绑定中继器?,asp.net,repeater,Asp.net,Repeater,我有一个中继器绑定来自数据库的数据。现在,单击它的行,我想绑定另一个详细信息的转发器。还有一件事,它们都不是嵌套的。 好的,让我用一个例子来解释,我有一个类的复读器。这个转发器有关于学校所有班级的绑定信息。现在我有了另一个转发器来获取特定班级的详细信息。现在当我点击班级列表中的特定班级时,然后,我将获得详细信息,即使用类id绑定第二个中继器。好。这样您就知道用户单击的行的特定id。在单击事件中,获取id并将其传递给存储过程,或者以任何方式绑定到中继器。请检查下面的内容 <asp:Repea

我有一个中继器绑定来自数据库的数据。现在,单击它的行,我想绑定另一个详细信息的转发器。还有一件事,它们都不是嵌套的。
好的,让我用一个例子来解释,我有一个类的复读器。这个转发器有关于学校所有班级的绑定信息。现在我有了另一个转发器来获取特定班级的详细信息。现在当我点击班级列表中的特定班级时,然后,我将获得详细信息,即使用类id绑定第二个中继器。

好。这样您就知道用户单击的行的特定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>

请尝试此操作。

好。这样您就知道用户单击的行的特定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>

试试这个。

我想这就是你想要的:

显示类的扩展信息的用户控件。一种web表单,具有绑定在类实体集合上的转发器。repeater的ItemTemplate由一个用于常规类信息的头和一个我们创建的UserControl实例组成,该UserControl的可见性设置为false。然后,我们根据用户是否希望查看详细信息来打开/关闭此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)

网络表单

(aspx)



(.cs文件)

//
///类实例的页面级集合
/// 
列出课程;
/// 
///显示扩展信息的当前类id
/// 
私人整数?活动ID
{
得到
{
if(this.ViewState[“ClassIdDetails”]==null)
{
返回null;
}
其他的
{
返回(int?)this.ViewState[“ClassIdDetails”];
}
}
设置
{
this.ViewState[“ClassIdDetails”]=值;
}
}
受保护的覆盖无效OnInit(事件参数e)
{
this.rptClassList.ItemDataBound+=新的RepeaterItemEventHandler(rptClassList\u ItemDataBound);
this.rptClassList.itemcond+=新的RepeaterCommandEventHandler(rptClassList_itemcond);
碱基.奥尼特(e);
}
void rptClassList_ItemCommand(对象源,RepeaterCommandEventArgs e)
{
//现在我们知道这是中继器上唯一的按钮,所以不需要检查CommandType
//设置新的ActiveId
this.ActiveId=Convert.ToInt32(e.CommandArgument);
//重新绑定中继器以刷新数据
这是BindData();
}
/// 
///对于每个类实体绑定,我们显示一些基本信息。
///我们还检查当前类是否为ActiveId。如果是,请打开“详细信息”面板并填充ClassDetailsUC
/// 
/// 
/// 
void rptClassList_ItemDataBound(对象发送方,RepeaterItemEventArgs e)
{
如果(e.Item.ItemType==ListItemType.Item | | e.Item.ItemType==ListItemType.AlternatingItem)
{
类classItem=(类)e.Item.DataItem;
((标签)e.Item.FindControl(“lblClassName”)).Text=classItem.Name;
((按钮)例如Item.FindControl(“btnShow”).CommandArgument=classItem.Id.ToString();
if(this.ActiveId.HasValue&&this.ActiveId==classItem.Id)
{
//我们想显示这个类的详细信息
((面板)e.Item.FindControl(“pnlDetails”).Visible=true;
//获取ClassDetails实例
ClassDetails details=此.RetrieveDetails(classItem.Id);
//填充uc
((ClassDetailsUC)e.Item.FindControl(“ucClassDetails”)).Populate(details);
}
}
}
受保护的无效页面加载(对象发送方、事件参数e)
{
//快速数据检索过程:)
类=新列表{
new ClassDetails(){Id=1,Name=“Class 1”},
new ClassDetails(){Id=2,Name=“Class 2”},
新建ClassDetails(){Id=3,Name=“Class 3”}
};
如果(!this.IsPostBack)
{
//仅在初始负载时绑定
这是BindData();
}
}
私有void BindData()
{
this.rptClassList.DataSource=this.classes;
这个.rptClassList.DataBind();
}
/// 
///模拟检索单个ClassDetails实例的快速函数
/// 
/// 
/// 
私有类详细信息检索详细信息(int id)
{
返回this.classes.Where(c=>c.Id==Id.Single();
}

我想这就是你想要的:

显示类的扩展信息的用户控件。一种web表单,具有绑定在类实体集合上的转发器。repeater的ItemTemplate由一个用于常规类信息的头和一个我们创建的UserControl实例组成,该UserControl的可见性设置为false。然后,我们根据用户是否希望查看详细信息来打开/关闭此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)

网络表单

(aspx)



(.cs文件)

//
///类实例的页面级集合
/// 
列出课程;
/// 
///显示扩展信息的当前类id
/// 
私人整数?活动ID
{
得到
{
if(this.ViewState[“ClassIdDetails”]==null)
{
返回null;
}
其他的
{
返回(int?)this.ViewState[“ClassIdDetails”];
}
}
设置
{
public void Populate(ClassDetails classDetails)
{
    this.lblNumWeeks.Text = classDetails.NumberOfWeeks.ToString();
}
<%@ 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>
/// <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();
}