错误ASP.net

wtlkbnrh  于 2023-05-23  发布在  .NET
关注(0)|答案(1)|浏览(175)

使用下面的ItemDataBound来计算我的页面字段的值,但我得到的是和Unexpected Error
C#:

protected void rptLicenseHistory_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    ((TextBox)e.Item.FindControl("txLicenseHistoryType")).Text = "Test";

}

ASP.NET:

<asp:Repeater ID="rptLicHistory" runat="server" onitemdatabound="rptLicenseHistory_ItemDataBound">
    <ItemTemplate>
        <div style="display:flex;width: 100%;align-items: center;">
            <div style="width:60px;">License:</div>
            <div style="width:170px;"><asp:TextBox ID="txLicenseHistoryType" runat="server"/></div>
        </div>
     </ItemTemplate>                    
     <SeparatorTemplate>
        <div style="height: 30px;">&nbsp;</div>
     </SeparatorTemplate>
</asp:Repeater>

Textbox ID "txLicenseHistoryType"应该返回“Test”,但我得到一个Unexpected Error。有什么想法我做错了什么吗?

beq87vna

beq87vna1#

您使用了错误的控制事件。大多数控件(甚至是普通的Jane文本框)都有databind事件。
您希望处理每一行,因此您希望使用数据“item”事件。
在大多数情况下,对于GridView,ListView和其他视图,它通常被称为“行数据绑定”之类的东西。
在中继器的情况下,我们甚至希望为每个项目,因此标记应该是这样的:

<asp:Repeater ID="rptLicHistory" runat="server"
    OnItemDataBound="rptLicHistory_ItemDataBound" >
    <ItemTemplate>
        <div style="display: flex; width: 100%; align-items: center;">
            <div style="width: 60px;">License:</div>
            <div style="width: 170px;">
                <asp:TextBox ID="txLicenseHistoryType" runat="server" /></div>
        </div>
    </ItemTemplate>
    <SeparatorTemplate>
        <div style="height: 30px;">&nbsp;</div>
    </SeparatorTemplate>
</asp:Repeater>

注意OnItemDataBound的使用-对于“每个”项目,它意味着帮助您记住。
所以,现在你的代码是这样的:

protected void rptLicHistory_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if ((e.Item.ItemType == ListItemType.Item) ||
        (e.Item.ItemType == ListItemType.AlternatingItem))
    {
        Debug.Print($"Working on row = {e.Item.ItemIndex}");
        ((TextBox)e.Item.FindControl("txLicenseHistoryType")).Text = "Test";
    }
}

请注意,您必须如何测试这是一个“item”还是一个“alternaterow”项。原因是你有标题行,和其他类型的模板行,所以你必须在代码中确保你只是抓取+处理行,或交替行。
运行时,上面应该是这样的:

编辑:获取每一行绑定的完整数据行

那么,用“测试”来代替“硬编码”分配?
我们可以这样做:

protected void rptLicHistory_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if ((e.Item.ItemType == ListItemType.Item) ||
            (e.Item.ItemType == ListItemType.AlternatingItem))
        {
            DataRowView MyDataRow = (DataRowView)e.Item.DataItem;
            ((TextBox)e.Item.FindControl("txLicenseHistoryType")).Text = MyDataRow["HotelName"].ToString();
        }

结果:

相关问题