树形控件数据刷新前,保存及还原展开和选中状态
Posted 刘继才
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树形控件数据刷新前,保存及还原展开和选中状态相关的知识,希望对你有一定的参考价值。
void __fastcall TMainFrm::SaveExpandedNodes(TTreeView *ATree,
std::map<AnsiString, Pointer>& g_TempList)
{
TTreeNode *ANode;
TTreeNode *ANextNode;
TTreeNodes *ANodes;
ANodes = ATree->Items;
g_TempList.clear();
Cardinal FlagVal = 0;
bool Expaned1 = false;
bool Selected1 = false;
ANode = ANodes->GetFirstNode();
while (ANode)
{
Expaned1 = ANode->Expanded;
Selected1 = ANode->Selected;
if (Expaned1 || Selected1)
{
FlagVal = Selected1 << 1;
FlagVal = FlagVal | Expaned1;
AnsiString S = ANode->Text;
g_TempList[S] = Pointer(FlagVal);
}
ANextNode = ANode->getFirstChild();
while (ANextNode)
{
bool Expaned = ANextNode->Expanded;
bool Selected = ANextNode->Selected;
if (Expaned || Selected) {
FlagVal = Selected << 1;
FlagVal = FlagVal | Expaned;
AnsiString S = ANode->Text + ANextNode->Text;
g_TempList[S] = Pointer(FlagVal);
}
ANextNode = ANode->GetNextChild(ANextNode);
}
ANode = ANode->getNextSibling();
}
}
void __fastcall TMainFrm::ExpandNodes(TTreeView *ATree, std::map<AnsiString,
Pointer>& g_TempList)
{
TTreeNodes *ANodes = ATree->Items;
TTreeNode *ANode = ANodes->GetFirstNode();
TTreeNode *ANextNode;
AnsiString S;
Pointer P;
Cardinal FlagVal;
bool Expand, Selected;
while (ANode)
{
S = ANode->Text;
P = g_TempList[S];
if (P != 0)
{
FlagVal = Cardinal(P);
Expand = FlagVal & 1;
Selected = (FlagVal >> 1) & 1;
if (Expand)
{
ANode->Expand(true);
}
if (Selected)
{
ANode->Selected = true;
}
}
ANextNode = ANode->getFirstChild();
while (ANextNode)
{
S = ANextNode->Text;
P = g_TempList[ANode->Text + S];
if (P != 0)
{
FlagVal = Cardinal(P);
Expand = FlagVal & 1;
Selected = (FlagVal >> 1) & 1;
if (Expand)
{
ANextNode->Expand(true);
}
if (Selected)
{
ANextNode->Selected = true;
}
}
ANextNode = ANode->GetNextChild(ANextNode);
}
ANode = ANode->getNextSibling();
}
}
以上是关于树形控件数据刷新前,保存及还原展开和选中状态的主要内容,如果未能解决你的问题,请参考以下文章
C# winform treeview 节点展开状态的图标设置