Laden...

[Gelöst] TreeView im UpdatePanel als User Control verursacht Full PostBack

Erstellt von tikra vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.716 Views
tikra Themenstarter:in
185 Beiträge seit 2007
vor 13 Jahren
[Gelöst] TreeView im UpdatePanel als User Control verursacht Full PostBack

Mein User Control sieht wie folgt aus (irrelevante Dinge gekürzt):

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Tree.ascx.cs" Inherits="Proj.Tree" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<asp:UpdatePanel ID="upTree" runat="server" UpdateMode="Conditional">
    <ContentTemplate>

            [...]

            <asp:TreeView ID="tv" runat="server" ShowCheckBoxes="All" ShowLines="false" onclick="doCheckBoxPostBack(event)"
                OnSelectedNodeChanged="tv_SelectedNodeChanged" OnTreeNodeExpanded="tv_TreeNodeExpanded"
                OnTreeNodeCheckChanged="tv_TreeNodeCheckChanged">
                <RootNodeStyle Font-Bold="true" />
            </asp:TreeView>
            
            [...]

        </asp:Panel>
    </ContentTemplate>
</asp:UpdatePanel>

Das "Besondere" hier ist, dass ich beim onclick-Event eine eigene doPostBack-Methode aufrufe, diese sieht wie folgt aus:

function doCheckBoxPostBack(e)
{
    var event = window.event ? window.event.srcElement : e.target;
    
    if (event.tagName == "INPUT" && event.type == "checkbox")
        __doPostBack("", "");
}

Wenn also eine Checkbox des TreeViews aktiviert/deaktiviert wurde führe ich die __doPostBack-Methode manuell auf.
Der Grund: Beim diesem Event wird leider kein automatischer PostBack durchgeführt, erst beim (Beispiel) expandieren eines Knotens wird dieser Event mit abgewickelt (warum auch immer).

Mein Problem ist jetzt, dass wenn ich eine Checkbox aktiviere ein Full PostBack der Seite durchgeführt wird, anstatt eines Partial PostBacks.

Als ich das TreeView und die Restlichen Controls des User Controls noch innerhalb der Default.aspx platziert hatte trat dieses Problem nicht auf, es verhielt sich so, wie ich es angedacht hatte: Partial PostBack.

Ich verrenne mich mit meinen Gedanken, je mehr ich darüber nachdenke, hat jemand evtl. eine neue Idee oder gar eine Lösung zu diesem Phänomen?

Vielen Dank

timmi

Edit: Glaube es hat etwas mit den Argumente zu tun, welche ich an die __doPostBack-Methode übergebe, wenn der erste Parameter der Name eines bekannten Controls ist, wird kein Full PostBack ausgeführt. Leider kann ich dies nicht auf mein User Control replizieren. Weder ein ID-/Control-Name aus der Default.aspx, noch einer aus dem UserControl.ascx zeigen eine Änderung.

Edit 2: Referenz welches ebenfalls mein Problem beschreibt, nur eben ohne die User Control-Problematik: http://forums.asp.net/p/1087628/4091989.aspx#4091989

tikra Themenstarter:in
185 Beiträge seit 2007
vor 13 Jahren

Hat sich erledigt, folgende Seite hat geholfen:

http://geekswithblogs.net/mnf/archive/2005/11/04/59081.aspx

Lösung: Der __EVENTTARGET-Parameter der __doPostBack-Methode muss bei UserControls wie folgt angesprochen werden: UserControl$ControlIdEinesUserControlElements

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<%@ Register Src="~/WebUserControl1.ascx" TagName="test" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Unbenannte Seite</title>

    <script>
    
        function doCheckBoxPostBack(e)
        {
            var event = window.event ? window.event.srcElement : e.target;
            
            if (event.tagName == "INPUT" && event.type == "checkbox")
                __doPostBack("meintest$Label1", "");
        }
    
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
    </asp:ToolkitScriptManager>
    <div>
        <uc1:test id="meintest" runat="server" />
        <asp:Label ID="Label2" runat="server" Text="Label2"></asp:Label>
    </div>
    </form>
</body>
</html>

WebUserControl1.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs"
    Inherits="WebApplication1.WebUserControl1" %>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged"
            OnTreeNodeCollapsed="TreeView1_TreeNodeCollapsed" onclick="doCheckBoxPostBack(event)"
            OnTreeNodeExpanded="TreeView1_TreeNodeExpanded" ShowCheckBoxes="All" 
            ontreenodecheckchanged="TreeView1_TreeNodeCheckChanged">
            <Nodes>
                <asp:TreeNode Text="a" Value="a">
                    <asp:TreeNode Text="aa" Value="aa"></asp:TreeNode>
                    <asp:TreeNode Text="ab" Value="ab"></asp:TreeNode>
                    <asp:TreeNode Text="ac" Value="ac"></asp:TreeNode>
                </asp:TreeNode>
                <asp:TreeNode Text="b" Value="b">
                    <asp:TreeNode Text="ba" Value="ba"></asp:TreeNode>
                    <asp:TreeNode Text="bb" Value="bb"></asp:TreeNode>
                    <asp:TreeNode Text="bc" Value="bc"></asp:TreeNode>
                </asp:TreeNode>
                <asp:TreeNode Text="c" Value="c">
                    <asp:TreeNode Text="ca" Value="ca"></asp:TreeNode>
                    <asp:TreeNode Text="cb" Value="cb"></asp:TreeNode>
                    <asp:TreeNode Text="cc" Value="cc"></asp:TreeNode>
                </asp:TreeNode>
            </Nodes>
        </asp:TreeView>
        <asp:Label ID="Label1" runat="server" Text="Label1"></asp:Label>
    </ContentTemplate>
</asp:UpdatePanel>