3 Stimmen

Falsche Javascript-Funktion aufgerufen, wenn ascx-Steuerelement zweimal zur Seite hinzugefügt wird

Ich habe ein Steuerelement, das eine Javascript-Funktion enthält, die auf dem Client-Klick-Ereignis einer Schaltfläche aufgerufen wird:

OnClientClicked="ClearTree" 

die Funktion:

    function ClearTree() {
        var tree = $find('<%=cboOrgUnits.Items[0].FindControl("tvOrgUnits").ClientID %>');
        var nodes = tree.get_nodes();
        for (var i = 0; i < nodes.get_count(); i++) {
            nodes.getNode(i).uncheck();
        }
   };

Das funktioniert alles gut, außer wenn das Steuerelement zweimal auf derselben Seite ist. Wenn es ist, gibt es 2 Instanzen der Funktion "ClearTree", von denen es scheint, die zweite hinzugefügt wird immer aufgerufen.

Das Problem ist, dass die aufgerufene Instanz von ClearTree() möglicherweise nicht auf den richtigen Baum verweist.

Welche Umgehungsmöglichkeiten gibt es dafür?

Hier ist der Rest des Markups:

<telerik:RadComboBox ID="cboOrgUnits" runat="server" Width="400px" ShowToggleImage="True" Style="vertical-align: middle;" EmptyMessage="Choose organisation units to group by" ExpandAnimation-Type="None" CollapseAnimation-Type="None">
<HeaderTemplate>
    <div>
        <span class="right" style="margin:2px"><telerik:RadButton ID="rbClear" runat="server" Text="Clear" Visible="True" OnClientClicked="ClearTree" AutoPostBack="False"/></span>
        <span class="right" style="margin:2px"><telerik:RadButton ID="rbDone" runat="server" Text="Done" Visible="True" OnClick="rbDone_Click"/></span>
        <div class="clear"></div>
    </div>
</HeaderTemplate>
<ItemTemplate>
    <div>
        <telerik:RadTreeView ID="tvOrgUnits" runat="server" CheckBoxes="true" Style="z-index: 100" CheckChildNodes="True">
            <Nodes>
            </Nodes>
        </telerik:RadTreeView>
    </div>
</ItemTemplate>
<Items>
    <telerik:RadComboBoxItem Text="" />
</Items>
</telerik:RadComboBox>

6voto

Michael Liu Punkte 48128

Anstelle der Einbettung der ClientID des Steuerelements innerhalb Ihrer Funktion, machen Sie es zu einem Funktionsparameter und ändern Sie dann Ihre OnClientClicked um die ClientID zur Funktion.

function ClearTree(id)
{
    var tree = $find(id);
    // ...
}

protected override void Render(HtmlTextWriter writer)
{
    rbClear.OnClientClicked = String.Format("ClearTree('{0}')", rbClear.ClientID);
    base.Render(writer);
}

UPDATE: Denn rbClear innerhalb einer Vorlage definiert ist, müssen Sie möglicherweise cboOrgUnits.FindControl("rbClear") um einen Verweis auf sie zu erhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X