просмотр дерева и постбэк - PullRequest
2 голосов
/ 18 марта 2010

У меня есть древовидная структура и уже код javascript для постбэка страницы. Потому что, когда я выбираю отца, автоматически выбираю детей.

это мой HTML-код

<script>
                                function postBackCheckBox()
                                {
                                    var o = window.event.srcElement;
                                    if (o.tagName == 'INPUT' && o.type == 'checkbox' && o.name != null && o.name.indexOf('CheckBox') > -1)
                                    {
                                        __doPostBack('LinkButton1', '');
                                    }
                                }
                            </script>

                            <asp:UpdatePanel UpdateMode="Conditional" ID="UpdatePanel1" runat="server">
                                <ContentTemplate>
                                    <asp:TreeView ID="HierarchicalTreeView" runat="server" OnSelectedNodeChanged="HierarchicalTreeView_SelectedNodeChanged"
                                        ShowLines="True" ExpandImageToolTip="Fechar &quot;{0}&quot;" CollapseImageToolTip="Fechar &quot;{0}&quot;"
                                        ExpandDepth="1" OnTreeNodeCheckChanged="HierarchicalTreeView_TreeNodeCheckChanged"
                                        EnableClientScripts="true">
                                        <NodeStyle CssClass="text" />
                                        <SelectedNodeStyle CssClass="text" Font-Bold="true" />
                                    </asp:TreeView>
                                </ContentTemplate>
                                </asp:UpdatePanel>
                            <asp:LinkButton ID="LinkButton1" runat="server" Visible="false"></asp:LinkButton>

и в C #

HierarchicalTreeView.Attributes.Add("onclick", "postBackCheckBox()");
ScriptManager scripManager = (ScriptManager)Page.Master.FindControl("ScriptManagerMaster");
scripManager.RegisterAsyncPostBackControl(LinkButton1);

Как я могу предотвратить отсылку всей страницы и только дерева? ???, так что не обновляйте страницу

Ответы [ 3 ]

3 голосов
/ 18 марта 2010
<asp:UpdatePanel UpdateMode="Conditional" ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:TreeView ID="HierarchicalTreeView" runat="server" OnSelectedNodeChanged="HierarchicalTreeView_SelectedNodeChanged"
            ShowLines="True" ExpandImageToolTip="Fechar &quot;{0}&quot;" CollapseImageToolTip="Fechar &quot;{0}&quot;"
            ExpandDepth="10" 
            OnTreeNodeCheckChanged="HierarchicalTreeView_TreeNodeCheckChanged" 
            ontreenodeexpanded="HierarchicalTreeView_TreeNodeExpanded">
            <NodeStyle CssClass="text" />
            <SelectedNodeStyle CssClass="text" Font-Bold="true" />
        </asp:TreeView>                                                                     
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="buttonCheck" EventName="click" />
    </Triggers>
</asp:UpdatePanel>

<asp:button ID="buttonCheck" runat="server" CausesValidation="false" />

код C #

 buttonCheck.Attributes.CssStyle["visibility"] = "hidden";
            HierarchicalTreeView.Attributes.Add("onclick", string.Format("document.getElementById('{0}').click();", buttonCheck.ClientID));
            ScriptManager scripManager = (ScriptManager)Page.Master.FindControl("ScriptManagerMaster");
            scripManager.RegisterAsyncPostBackControl(buttonCheck);
1 голос
/ 12 января 2012

Глупо разрешать флажок в древовидной структуре, но не иметь для него обработчика событий. Это обходной путь, если вы не используете SelectNodeChanged для каких-либо других целей, попробуйте это, вместо того, чтобы нажимать флажок напрямую, вы нажимаете узел, но ваш пользователь должен быть уведомлен об этом :)

Protected Sub tvCust_SelectedNodeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles tvCust.SelectedNodeChanged
    Dim enode As TreeNode = tvCust.SelectedNode
    If enode.Checked = False Then
        enode.Checked = True
    Else
        enode.Checked = False
    End If
    tvCust_TreeNodeCheckChanged(enode)
End Sub

Protected Sub tvCust_TreeNodeCheckChanged(ByVal e As TreeNode)
    Try
        Select Case e.Depth
            Case 0  'parent
                Dim child As TreeNode
                For Each child In e.ChildNodes
                    child.Checked = e.Checked
                Next
            Case Else
                Dim cnt As Integer = 0
                Dim child As TreeNode
                For Each child In e.Parent.ChildNodes
                    If child.Checked = True Then
                        cnt += 1
                    End If
                Next
                If cnt = e.Parent.ChildNodes.Count Then
                    e.Parent.Checked = True
                Else
                    e.Parent.Checked = False
                End If
        End Select

    Catch ex As Exception

    End Try
End Sub
1 голос
/ 18 марта 2010

Для этого вам нужно использовать Ajax, например, поместите дерево в UpdatePanel .

Попробуйте вызвать функцию __dopostback следующим образом:

 __doPostBack('<%= LinkButton1.ClientID %>', '');
...