无法设置 TreeView.SelectedNode 属性
Can't set TreeView.SelectedNode Property
我试图在清理并重新填充我的树视图后设置选定的节点。这是我试过的代码:
private TreeNode selectednode;
private void ElementTextChanged(object sender, EventArgs e)//saves changes to the XElements displayed in the textboxes
{
BusinessLayer.ElementName = (sender as TextBox).Tag.ToString();
string Type = (sender as TextBox).Name;
string Value = (sender as TextBox).Text;
if (TView_.SelectedNode!=null)
{
selectednode = TView_.SelectedNode;
}
string NodePath = TView_.SelectedNode.FullPath.Replace("\", "/");
Telementchange.Stop();
Telementchange.Interval = 2000;
Telementchange.Tick += (object _sender, EventArgs _e) => {
if (Type=="Value")
{
BusinessLayer.ChangeElementValue(NodePath,Value);//nembiztos hogy így kéne ezt meghívni
}
else
{
BusinessLayer.ChangeElementName(NodePath, Value);
BusinessLayer.ElementName = Value;
}
FillTree(BusinessLayer.Doc);
TView_.SelectedNode = selectednode; //nemműködikezaszar!!!!!
TView_.Select();
Telementchange.Stop();
};
Telementchange.Start();
}
在我设置 TView_.SelectedNode
属性 后的某个季节,它为空。
感谢您的帮助!
查看您展示的代码,您似乎是这样做的:
- 将当前 selected
Node
存储在一个变量中
- 清洁并重新装满
TreeView
- select存储的
Node
这肯定会失败,因为在填充后的那一刻,存储的 Node
不再是 TreeView
节点集合的一部分,除非您在填充例程中再次添加它..
我不认为你会那样做。
如果您想重新select 某个节点,您需要在新的节点集合中识别它。如果 Text
足以执行递归 TreeView
搜索,就像 L.B 在 this post 中的答案一样(虽然不是公认的答案!)
我无法通过设置 SelectedNode 属性 解决我的问题,所以我做了一个解决方法。
private void RefreshTreeView()
{
FillTree(BusinessLayer.Doc);
TView_.SelectedNode = _selectednode;
ExpandToPath(TView_.TopNode, _selectedPath);
}
void ExpandToPath(TreeNode relativeRoot, string path)
{
char delimiter = '\';
List<string> elements = path.Split(delimiter).ToList();
elements.RemoveAt(0);
relativeRoot.Expand();
if (elements.Count == 0)
{
TView_.SelectedNode = relativeRoot;
return;
}
foreach (TreeNode node in relativeRoot.Nodes)
{
if (node.Text == elements[0])
{
ExpandToPath(node, string.Join(delimiter.ToString(),elements));
}
}
}
我试图在清理并重新填充我的树视图后设置选定的节点。这是我试过的代码:
private TreeNode selectednode;
private void ElementTextChanged(object sender, EventArgs e)//saves changes to the XElements displayed in the textboxes
{
BusinessLayer.ElementName = (sender as TextBox).Tag.ToString();
string Type = (sender as TextBox).Name;
string Value = (sender as TextBox).Text;
if (TView_.SelectedNode!=null)
{
selectednode = TView_.SelectedNode;
}
string NodePath = TView_.SelectedNode.FullPath.Replace("\", "/");
Telementchange.Stop();
Telementchange.Interval = 2000;
Telementchange.Tick += (object _sender, EventArgs _e) => {
if (Type=="Value")
{
BusinessLayer.ChangeElementValue(NodePath,Value);//nembiztos hogy így kéne ezt meghívni
}
else
{
BusinessLayer.ChangeElementName(NodePath, Value);
BusinessLayer.ElementName = Value;
}
FillTree(BusinessLayer.Doc);
TView_.SelectedNode = selectednode; //nemműködikezaszar!!!!!
TView_.Select();
Telementchange.Stop();
};
Telementchange.Start();
}
在我设置 TView_.SelectedNode
属性 后的某个季节,它为空。
感谢您的帮助!
查看您展示的代码,您似乎是这样做的:
- 将当前 selected
Node
存储在一个变量中 - 清洁并重新装满
TreeView
- select存储的
Node
这肯定会失败,因为在填充后的那一刻,存储的 Node
不再是 TreeView
节点集合的一部分,除非您在填充例程中再次添加它..
我不认为你会那样做。
如果您想重新select 某个节点,您需要在新的节点集合中识别它。如果 Text
足以执行递归 TreeView
搜索,就像 L.B 在 this post 中的答案一样(虽然不是公认的答案!)
我无法通过设置 SelectedNode 属性 解决我的问题,所以我做了一个解决方法。
private void RefreshTreeView()
{
FillTree(BusinessLayer.Doc);
TView_.SelectedNode = _selectednode;
ExpandToPath(TView_.TopNode, _selectedPath);
}
void ExpandToPath(TreeNode relativeRoot, string path)
{
char delimiter = '\';
List<string> elements = path.Split(delimiter).ToList();
elements.RemoveAt(0);
relativeRoot.Expand();
if (elements.Count == 0)
{
TView_.SelectedNode = relativeRoot;
return;
}
foreach (TreeNode node in relativeRoot.Nodes)
{
if (node.Text == elements[0])
{
ExpandToPath(node, string.Join(delimiter.ToString(),elements));
}
}
}