1

我正在尝试在 ASP.Net ListView 的 EditItemTemplate 中的一组控件上设置一些客户端属性。

例如,如果 EditItemTemplate 包含如下内容:

<tr id='phoneRow'>
  <td>
    <asp:Label ID="lblPhoneLabel" runat="server" Text="Phone Number: " />
  </td>
  <td>
    <asp:Label ID="lblPhoneNumber" runat="server" 
               Text='<%# Bind("PhoneNumber") %>' />
  </td>
</tr>

如果确实有电话号码,我只想显示该行,因此 JavaScript 类似于:

function showOrHidePhoneRow(rowId, labelId)
{
    var row = document.getElementById(rowId);
    var label = document.getElementById(labelId);

    if (label.value == "")
        row.style.visibility = "collapsed";
    else
        row.style.visibility = "visible";
}

我正在尝试在代码隐藏中添加对此函数的调用,但我不确定如何。看来onload为时已晚。

protected void lvwExample_ItemCreated(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        ListViewDataItem item = e.Item as ListViewDataItem;
        if (item.DisplayIndex == lvwExample.EditIndex)
        {
            Label label = item.FindControl("lblPhoneNumber") as Label;
            if (label != null)
            {
                // Get here, but row always visible
                label.Attributes.Add("onload",
                    "showOrHidePhoneRow('phoneRow', '" + label.ClientId + "');");
            }
        }
    }
}

任何指针将不胜感激。

谢谢,wTS

4

1 回答 1

1

这里的问题是asp:label标签在html中呈现为span标签......并且标签中不存在onload事件......所以你在正确的时间设置属性,但你是试图处理一个不会被解雇的事件!我认为解决方案是完全避免在您的场景中执行 javascript 并使用服务器事件来处理它。就像是

Protected Sub ListView1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles ListView1.ItemDataBound
    Dim myLabel As Label = e.Item.FindControl("lblPhoneNumber")
    If Not myLabel Is Nothing Then
        e.Item.Visible = IIf(myLabel.Text = "", True, False)
    End If
End Sub

这样,您可以处理每个项目并根据标签的值决定是否要隐藏您的行。

于 2010-09-13T15:17:42.887 回答