【问题标题】:repeater row highlight does not persist after postback回发后转发器行突出显示不会持续存在
【发布时间】:2013-07-18 18:42:14
【问题描述】:

当我单击该行上的任意位置时,我正在突出显示转发器行。然后当我点击另一行时,前一行变得未突出显示。所以它起作用了,但只是一瞬间。一旦modalpopup出现,亮点就消失了。顺便说一句,我在每一行都有一个链接按钮来显示模态弹出窗口,并且我将转发器内的所有标签都设置为关联控件。所以中继器中的文本都充当链接按钮。我知道突出显示不突出显示的东西有效,因为当我只单击没有文本的区域时效果仍然存在。我知道单击链接按钮引起的回发消除了 javascript 的效果。我想知道的是,我能做些什么呢?请帮帮我。

这是我的代码。

头:

<script type = "text/javascript">
    var T0;
    function CngClass(cls){
        this.lst=null;
        this.cls=cls;
    }

    CngClass.prototype.CngClass=function(obj){
        if (typeof(obj)=='string') obj=document.getElementById(obj);
        if (this.lst) this.lst.className='';
        obj.className=this.cls;
        this.lst=obj;
    }    

<style type="text/css">
    .selected
    {
        background-color: Red;
    }
</style>

主体:

<body onload="T0=new CngClass('selected');T0.CngClass('t0');">

中继器的ItemTemplate:

<ItemTemplate> 
    <tr id="t0" runat="server" onclick="T0.CngClass(this);" onmouseover="style.backgroundColor='Gainsboro'" onmouseout="style.backgroundColor=''" style="cursor: pointer">
        <td><asp:Label ID="lblfullname" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "FULLNAME")%>' AssociatedControlID="lnkselect" />
            <asp:HiddenField ID="hiddenrecnum" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "RECORD_ID")%>' />
        </td>
        <td><asp:Label ID="lbldeptname" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "DEPT_NAME")%>' AssociatedControlID="lnkselect" /></td>
        <td><asp:Label ID="lbldivisions" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "DIVISIONS")%>' AssociatedControlID="lnkselect" /></td>
        <td><asp:Label ID="lblposition" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "POSITION")%>' AssociatedControlID="lnkselect" />
            <asp:LinkButton ID="lnkselect" runat="server" /></td>
    </tr>
</ItemTemplate>

【问题讨论】:

    标签: javascript asp.net repeater


    【解决方案1】:

    有几种方法可以解决此问题。

    • 在页面中添加一个由 JavaScript 设置的隐藏字段。检查隐藏字段客户端或服务器端,如果字段有值则重新应用效果。

    • 如果点击该行已经导致回发,您可以在服务器端设置选定样式,并在 ViewState 中维护选定行的 ID。

    理想情况下,您应该尽量减少页面重新加载的次数。请记住,整个 POST 集合(包括 ViewState,在转发器中包含所有这些标签控件时将非常大)正在发送到服务器并在每次回发时写回客户端。

    示例(客户端 + 服务器)

    在页面标记中:

    <!-- hidden field to store value -->
    <input type="hidden" id="hdnSelectedRow" runat="server" />
    
    <script>
    
    
    
    // This example doesn't use any external libraries, but I suggest using
    // jQuery if you want to do more complex manipulation client-side.
    function setSelectedRow(sender, id){
        sender.className = "selected";
        // probably need to also deselect any existing selected item
    
        // 
    
        // Store the selected ID in the hidden field. Note that we use the 
        // server's ID for the control, since ASP.NET may add a prefix to the ID.
        document.getElementById("<%=this.hdnSelectedRow.ClientID%>").value = id;
    }
    
    </script>
    
    <!-- This assumes that clicking on the row doesn't always postback the 
    whole grid. If you are always posting back, you probably should just modify
    the state of the grid server-side. -->
    <ItemTemplate> 
            <tr id="t0" runat="server" 
                        onclick="selectSelected(this, '<%#Eval("RECORD_ID")%>')">
    ...
    

    在代码隐藏中:

    protected override OnLoad( EventArgs e )
    {
        string selectedId = this.hdnSelectedRow.Text;
        if( !string.IsNullOrWhiteSpace( selectedId ) )
        {
            // act
        }
    }
    

    【讨论】:

    • 多莫提姆大人!实际上,我昨晚确实按照您在第二个选项中的建议进行了操作。我想把这个突出的东西保留在客户端,但是因为在服务器端做这件事真的容易得多,所以我决定继续这样做。现在您的第一个选项对我来说听起来更好,但是我如何检查隐藏字段客户端?也许一些代码可以将我指向正确的轨道? Arigatou ne!
    • @ArtemisTan - 像 jQuery 这样的库使客户端操作变得容易:api.jquery.com/val。如果你想访问服务器上隐藏字段的值,只需在标签中添加runat="server",并给它一个ID。
    • @ArtemisTan - 我添加了一个粗略的例子来展示隐藏字段的使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2017-04-23
    • 2019-10-20
    相关资源
    最近更新 更多