2009-05-22 150 views
1

我正在使用一个使用中继器的表单,我一直在努力,我正在尝试编写一个事件处理程序,它将获得中继器中某些控件的值在提交包含中继器的表单之后。我认为,如果我想找回从第一中继器项目的标签类似这样的东西会工作,那么它的文本设置为其它标签的文本:需要FindControl功能的帮助

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

但是利用这一点,似乎MyLabel .Text是空的。设置后如果测试MyLabel为空,则结果为false,因此我试图找出为什么MyLabel的内容不会与我尝试设置的重复项目中的内容相同。 MyLabel2已经在类的顶部声明了。提前致谢。

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

+0

郁郁葱葱,你可以发布你的HTML/ASPX片段告诉我们你是如何产生这个。 – 2009-05-23 00:46:07

+0

实际上,如果您可以发布URL或原始HTML输出,我可以告诉很多 - 我通常使用FireBug来查看信息如何输出到屏幕。它和quickwatch之间很容易找到任何东西 – 2009-05-23 05:10:24

+0

输出HTML只是一个空白的跨度。 – 2009-05-23 14:21:29

回答

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的文本属性未设置和数据 被在客户端结合到在标签的本体控制。 在Label已经呈现到页面之后被写入span标记,并且永远不会直接绑定到Label Control。只有当您在标签主体中使用行脚本时才会发生这种情况,如果它只是文本,则标签的主体始终会覆盖Label的Text Attribute值。

对于Label2的文本属性被设置 因此正在发生服务器 迫使它呈现完毕后的标签,因此你的其他控件访问之前评估内嵌脚本的结合。

没有真正看到你的中继器,我怀疑这是你的数据绑定的方式。

这里有一些测试代码向你证明这种情况。

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

插入并添加几个额外的标签,您将看到Label4有您正在查找的数据,而Label3是空白的。

0

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