1

ASP.NetListViewの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";
}

コードビハインドでこの関数の呼び出しを追加しようとしていますが、方法がわかりません。オンロードが遅すぎるようです。

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でスパンタグとしてレンダリングされ、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 に答える