在Winform界面中,有的用到了TreeList控件。并且有一些功能需要用户在一个文本框中输入某些关键字,点击一个按钮能够自动去一个一个的匹配,并定位到拥有关键字的树节点。
类似于:
为达到该功能,我写了一个公共方法方便系统中多处使用。
/// <summary>
/// 通过字符串设置焦点节点
/// </summary>
/// <param name="tr">树</param>
/// <param name="displayText">显示值</param>
public void SetFocusedNodeByDisplayText(TreeList tr, string displayText)
{
if (tr.Nodes.Count == 0) return;
List<TreeListNode> lstNode = tr.GetNodeList(); //获取树的所有节点
int i = lstNode.IndexOf(tr.FocusedNode); //焦点节点所在的位置
int beginIndex = i + 1; //开始搜索匹配的位置
int waitIndex = lstNode.Count - 1 - i; //开始位置后面需要匹配的节点位数
bool isFind = false; //是否找到需要的节点
if (beginIndex == lstNode.Count - 1) //如果焦点节点是树中的最后一个节点,则从0开始匹配
{
beginIndex = 0;
}
while (beginIndex < lstNode.Count) //从焦点节点到最后一个节点间进行匹配
{
if (lstNode[beginIndex].GetDisplayText(tr.Columns[0].FieldName).Contains(displayText))
{
tr.FocusedNode = lstNode[beginIndex];
lstNode[beginIndex].Expand();
isFind = true;
break;
}
beginIndex += 1;
}
if (isFind == false)//如果在焦点节点到最后一个节点中没有匹配到想要的结果,则匹配从0开始到焦点节点位置
{
//匹配开始位置之前的
for (int j = 0; j < lstNode.Count - waitIndex; j++)
{
if (lstNode[j].GetDisplayText(tr.Columns[0].FieldName).Contains(displayText))
{
tr.FocusedNode = lstNode[j];
lstNode[j].Expand();
break;
}
}
}
}