treelist设置展开卡顿:Devexpress中的TreeList是经常用到的数据浏览管理控件,它的数据加载方式通常是赋予DataSource数据源,并指定ParentFieldName和KeyFieldName来确定"父子"关系,这种绑定方式 *** 作简单,但加载和 *** 作十分卡顿(100个节点),用户体验非常差。
推荐使用AppendNode逐条加载,此方法有多个重载方法,支持设置节点数据对象(object数据组或DataRow)、父节点ID、父节点、图像索引、选择状态、tag值等。
DataTable dtTree = new DataTable();
dtTreeColumnsAdd("ID",typeof(string));
dtTreeColumnsAdd("Code", typeof(string));
dtTreeColumnsAdd("Name", typeof(string));
dtTreeColumnsAdd("Description", typeof(string));
dtTreeColumnsAdd("ParentID", typeof(string));
//新增加的列 布尔类型才能绑定checkbox
dtTreeColumnsAdd("Tag", typeof(bool));
dtTreeColumnsAdd("Happy", typeof(string));
DataRow row = dtTreeNewRow();
row["ID"] = "1";
row["Code"] = "001";
row["Name"] = "野原广志";
row["Description"] = "野原广志";
row["ParentID"] = "-1";
row["tag"] = false;
row["Happy"] = "爱吃青椒";
dtTreeRowsAdd(row);
DataRow row2 = dtTreeNewRow();
row2["ID"] = "2";
row2["Code"] = "002";
row2["Name"] = "野原美呀";
row2["Description"] = "野原美呀";
row2["ParentID"] = "-1";
row2["tag"] = false;
row2["Happy"] = "爱吃青椒";
dtTreeRowsAdd(row2);
DataRow row3 = dtTreeNewRow();
row3["ID"] = "3";
row3["Code"] = "003";
row3["Name"] = "野原新之助";
row3["Description"] = "野原新之助";
row3["ParentID"] = "-1";
row3["tag"] = false;
row3["Happy"] = "不爱吃青椒";
dtTreeRowsAdd(row3);
DataRow row4 = dtTreeNewRow();
row4["ID"] = "4";
row4["Code"] = "004";
row4["Name"] = "野原小白";
row4["Description"] = "野原小白";
row4["ParentID"] = "3";
row4["tag"] = false;
row4["Happy"] = "不爱吃青椒";
dtTreeRowsAdd(row4);
//模拟数据 将查询出来的datatable添加一列 例如:tag
//然后查询datatable type列 当type为“板式”,“沙发”时 将tag列置为true
DataRow[] drs = dtTreeSelect("Happy='爱吃青椒'");
foreach (DataRow item in drs)
{
item["tag"] = true;
}
treeList1DataSource = dtTree;
树形控件是使用频率很高的一种控件。对于属性控件往往需要下面两个功能
1TreeList带有CheckBox,并且节点要有三种状态(所有的子节点都选中,所有的子节点都没选择,一部分子节点选中)。使用DevXpress的TreeList控件很容易实现这一功能。
设置TreeListOptionsViewShowCheckBoxes = true //是否显示CheckBox
设置TreeListOptionsBehaviorAllowIndeterminateCheckState = true; //设置节点是否有中间状态,即一部分子节点选中,一部分子节点没有选中
设置这两个属性之后就实现了TreeList带有CheckBox,并且节点有三种状态。
2选中父节点或者子节点相互影响的功能,如选择父节点选择所有子节点。绑定TreeList的两个事件AfterCheckNode和BeforeCheckNode
实现功能的代码如下:
private void treeList1_AfterCheckNode(object sender, DevExpressXtraTreeListNodeEventArgs e)
{
SetCheckedChildNodes(eNode, eNodeCheckState);
SetCheckedParentNodes(eNode, eNodeCheckState);
}
private void treeList1_BeforeCheckNode(object sender, DevExpressXtraTreeListCheckNodeEventArgs e)
{
eState = (ePrevState == CheckStateChecked CheckStateUnchecked : CheckStateChecked);
}
/// <summary>
/// 设置子节点的状态
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedChildNodes(TreeListNode node, CheckState check)
{
for (int i = 0; i < nodeNodesCount; i++)
{
nodeNodes[i]CheckState = check;
SetCheckedChildNodes(nodeNodes[i], check);
}
}
/// <summary>
/// 设置父节点的状态
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
private void SetCheckedParentNodes(TreeListNode node, CheckState check)
{
if (nodeParentNode != null)
{
bool b = false;
CheckState state;
for (int i = 0; i < nodeParentNodeNodesCount; i++)
{
state = (CheckState)nodeParentNodeNodes[i]CheckState;
if (!checkEquals(state))
{
b = !b;
break;
}
}
nodeParentNodeCheckState = b CheckStateIndeterminate : check;
SetCheckedParentNodes(nodeParentNode, check);
}
}
1TreeListNodeCellStyle事件
Node的显示(包括窗口的切换导致Node的显示)和状态的改变都会触发该事件。该事件主要用来改变Node的显示样式。
private void treeList1_NodeCellStyle(object sender, DevExpressXtraTreeListGetCustomNodeCellStyleEventArgs e)
{
if (eNodeCheckState == CheckStateUnchecked)
{
eAppearanceFont = new Font(DevExpressUtilsAppearanceObjectDefaultFont, FontStyleStrikeout);
eAppearanceForeColor = ColorGray;
}
}
上面的代码是实现的效果是 : CheckState为Unchecked的节点的字带有中划线且背景灰色。
2TreeListDoubleClick事件
双击Node时触发,但要注意的是要在TreeListOptionsBehaviorEditable = false的情况下,双击Node才能触发该事件。
private void treeList1_DoubleClick(object sender, EventArgs e)
{
TreeListNode clickedNode = thistreeList1FocusedNode;
string disPlayText = clickedNodeGetDisplayText("test");
MessageBoxShow("You clicked " + disPlayText);
}
3TreeList的命中测试特性
private void treeList1_MouseMove(object sender, MouseEventArgs e)
{
Point point = treeList1PointToClient(CursorPosition);
TreeListHitInfo hitInfo = treeList1CalcHitInfo(point);
switch (hitInfoHitInfoType)
{
case HitInfoTypeCell:
thisCursor = CursorsHand;
break;
case HitInfoTypeNodeCheckBox:
thisCursor = CursorsPanEast;
break;
default :
thisCursor = CursorsDefault;
break;
}
}
treeListAppendNode(参数1,参数2)//添加节点的方法
例如:
TreeListNode ParentNode=treeListAppendNode(null,null);//添加第一节点
ParentNodeSetValue(treeListColumns[0], "显示的值");//添加第一节点显示的值
private string FullNameByNode(TreeListNode node, int columnId)
{
/+++++++/ if(nodeGetValue(columnId)==null) {return stringEmpty;}
string ret = ConvertToString(nodeGetValue(columnId));
if (nodeParentNode != null)
{
node = nodeParentNode;
ret = nodeGetValue(columnId)ToString() + "\\" + ret; //得到所选中行节点的第一个值“\\”是隔开父节点和子节点
}
return ret;
}
treeList_FocusedNodeChanged这个时间,貌似在创建控件的时候都会触发一次,即使没有绑定数据源,取值前判断一下
你这样做的话,可以加个判断就行了 答案补充 这样可以!传个值到地址拦上去,再去取就可以达到你的效果! 答案补充 选中时,取个值把这个值传到地址上面去,GET传值再去取
这样随你怎么刷新,都不会变依然是你选中的那个节点
带不带复选框你都要用递归才能取到全部子节点。
private void GetChildNodes(TreeListNode parentNode, List<TreeListNode> list)
{
if(parentNodeNodesCount > 0)
{
foreach(TreeListNode node in ParentNodeNodes)
{
listAdd(node);
if(nodeNodesCount > 0)
{
GetChildNodes(node, list);
}
}
}
}
以上就是关于treelist设置展开卡顿全部的内容,包括:treelist设置展开卡顿、devexpress treelist 绑定数据时让部分节点默认选择、devexpress控件中的treelist怎么弄多表头等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)