需要FindControl功能的帮助

时间:2009-05-22 21:44:38

标签: c# asp.net

我正在玩一个使用我一直在处理的转发器的表单,我正在尝试编写一个事件处理程序,它将在包含该转发器的表单后获取转发器内部某些控件的值转发器已提交。我假设如果我想从第一个转发器项中检索标签,然后将其文本设置为另一个标签的文本,那么类似于此的内容将起作用:

protected void SubmitMessage_Click(object sender, EventArgs e)
{
    Label MyLabel = (Label)MyRepeater.Items[0].FindControl("MessageID");
    MyLabel2.Text = MyLabel.Text;
}

然而,使用它,似乎MyLabel.Text为空。在设置后测试MyLabel是否为null时,结果为false,所以我试图找出为什么MyLabel与我试图将其设置为的转发器项目中的内容相同的原因。 MyLabel2已经在类的顶部声明。提前谢谢。

编辑:.aspx文件中标签的文本不是在文本属性中的数据绑定,而是在标签本身的容器中。我会在周二早上尝试另一种方法,只要我能回到我的代码中,就本杰明的建议。

2 个答案:

答案 0 :(得分:2)

归结为如何将数据绑定到转发器上的标签。

<asp:Repeater ID="Repeater1" runat="server">

<ItemTemplate>

    <asp:Label ID="Label1" runat="server"><%# DataBinder.Eval(Container.DataItem,"CustomerName") %></asp:Label>

    <asp:Label ID="Label2" runat="server" Text=<%# DataBinder.Eval(Container.DataItem,"Country") %>></asp:Label>

    </ItemTemplate>
</asp:Repeater>

Label1未设置Text属性,并且数据在客户端绑定到Label正文中的控件。 在Label之后写入span标记呈现给页面并且永远不会直接绑定到Label Control。只有当您在Label的正文中使用行内脚本时才会发生这种情况,如果它只是文本,则标签的正文始终会覆盖Label的Text Attribute值。

对于Label2,Text属性被设置为,因此绑定发生在服务器上 强制它在完成呈现Label 之前评估内联脚本,因此可以通过其他控件访问。

如果没有真正看到您的转发器,我怀疑这是您的数据绑定方式。

以下是一些测试代码,可以向您证明此案例。

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            DataSet ds = new DataSet();
            DataTable dt = ds.Tables.Add("Customer");
            dt.Columns.Add("CustomerName", Type.GetType("System.String"));
            dt.Columns.Add("Country", Type.GetType("System.String"));

            DataRow dr = dt.NewRow();
            dr[0] = "Testcustomer1";
            dr[1] = "USA";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr[0] = "Testcustomer2";
            dr[1] = "UK";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr[0] = "Testcustomer3";
            dr[1] = "GERMANY";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr[0] = "Testcustomer4";
            dr[1] = "FRANCE";
            dt.Rows.Add(dr);

            //Bind the data to the Repeater
            Repeater1.DataSource = ds;
            Repeater1.DataMember = "Customer";
            Repeater1.DataBind();
        }

    }

    protected void SubmitMessage_Click(object sender, EventArgs e)
    {
        Label MyLabel = (Label)Repeater1.Items[0].FindControl("Label1");
        Label MyLabel2 = (Label)Repeater1.Items[0].FindControl("Label2");
        //Empty String Text was never set server side
        Label3.Text = MyLabel.Text;
        //String is found because Text was set
        Label4.Text = MyLabel2.Text;
    }

将其插入并添加一些额外的标签,当Label3为空白时,您会看到Label4包含您要查找的数据。

答案 1 :(得分:0)

我不确定这一点但是当事件执行时,转发器可能还没有重新填充。由于对方法的调用是“ByVal”(VB说话)而不是ByRef,值可能会被传递,但原始对象尚未填充...只是一个想法......