Как я могу очистить предыдущий выбор, когда asp:TreeView находится в UpdatePanel?
-
03-07-2019 - |
Вопрос
У меня есть страница ASP.Net 2.0, содержащая две панели обновления.Первая панель содержит TreeView.Вторая панель содержит метку и вызывается выбором в дереве.Когда я выбираю узел, метка обновляется, как и ожидалось, и TreeNode
тот, на который я нажал, становится выделенным, а ранее выбранный узел больше не выделяется.Однако если узел изначально выделен (выбран) в коде программной части, выделение не удаляется при выборе другого узла.
Разметка
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional">
<ContentTemplate>
<asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged">
<SelectedNodeStyle BackColor="Pink" />
</asp:TreeView>
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="True">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text=" - "></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="TreeView1" EventName="SelectedNodeChanged" />
</Triggers>
</asp:UpdatePanel>
Код позади
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
TreeView1.Nodes.Add(new TreeNode("Test 1", "Test One"));
TreeView1.Nodes.Add(new TreeNode("Test 2", "Test Two"));
TreeView1.Nodes.Add(new TreeNode("Test 3", "Test Three"));
TreeView1.Nodes.Add(new TreeNode("Test 4", "Test Four"));
TreeView1.Nodes[0].Selected = true;
}
}
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
Label1.Text = TreeView1.SelectedValue;
}
В начале выбирается первый узел.Почему его подсветка не удаляется при выборе другого узла?
Кроме того, я спросил другое вопрос про ту же установку на который у меня нет ответа.Любая помощь будет оценена по достоинству.
Редактировать Я знаю эту настройку ChildrenAsTriggers="false"
будет работать, но я хочу избежать повторного рендеринга дерева, поскольку оно может быть очень большим.
Решение 3
Это может быть своего рода хаком, но это очистит выбор на клиенте и позволит избежать обновления панели.
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function BeginRequestHandler(sender, args)
{
var elem = args.get_postBackElement();
var selectedClassName = elem.id + '_1';
var arrAllElements = GetElementsByClassName(selectedClassName, elem);
var selectedNode = $get(elem.id + '_SelectedNode').value;
for(var i = 0; i < arrAllElements.length; i++)
{
if(arrAllElements[i].childNodes[0].id != selectedNode)
RemoveClassName(arrAllElements[i], selectedClassName );
}
}
);
Он удаляет выбранный стиль/класс из всех узлов дерева, если его значение не содержится в скрытом поле «_SelectedNode».GetElementsByClassName
и RemoveClassName
находятся в моей собственной библиотеке js, но они достаточно очевидны.
Другие советы
/// <summary>
/// Remove selection from TreeView
/// </summary>
/// <param name="tree"></param>
public static void ClearTreeView(TreeView tree)
{
if (tree.SelectedNode != null)
{
tree.SelectedNode.Selected = false;
}
}
Вам необходимо установить значение false для всех узлов.
Я использую что-то подобное для одного из своих приложений (с моими древовидными tvCategories):
public void RefreshSelection(string guid)
{
if (guid == string.Empty)
ClearNodes(tvCategories.Nodes);
else
SelectNode(guid, tvCategories.Nodes);
}
private void ClearNodes(TreeNodeCollection tnc)
{
foreach (TreeNode n in tnc)
{
n.Selected = false;
ClearNodes(n.ChildNodes);
}
}
private bool SelectNode(string guid, TreeNodeCollection tnc)
{
foreach (TreeNode n in tnc)
{
if (n.Value == guid)
{
n.Selected = true;
return true;
}
else
{
SelectNode(guid, n.ChildNodes);
}
}
return false;
}