想在TREEVIEW实现这样的CHECKBOX效果
若某节点的全部子节点都选中,则该节点的CHECKBOX显示黑色对勾图标,否则显示灰色对勾图标。
为此已在StateImageList加入了第三个图标(灰色对勾)。
但矛盾的是:
要显示第三个图标,应该使CheckBoxes = False,但这样就不能触发AfterCheck事件,而我又需要在AfterCheck事件中处理节点的CHECK状态。
要触发AfterCheck事件,必须使CheckBoxes = True,但这样又不能显示第三个图标。
请教各位,如何调和这一对矛盾?或者是否可以用其他办法来实现?
若某节点的全部子节点都选中,则该节点的CHECKBOX显示黑色对勾图标,否则显示灰色对勾图标。
为此已在StateImageList加入了第三个图标(灰色对勾)。
但矛盾的是:
要显示第三个图标,应该使CheckBoxes = False,但这样就不能触发AfterCheck事件,而我又需要在AfterCheck事件中处理节点的CHECK状态。
要触发AfterCheck事件,必须使CheckBoxes = True,但这样又不能显示第三个图标。
请教各位,如何调和这一对矛盾?或者是否可以用其他办法来实现?
StateImageList中的三个图标:
第一个 空白
第二个 黑色对勾
第三个 灰色对勾
如果不知道可以看下WINDOWS附件-系统工具-备份中目录树的效果。
/// Set tree node checkbox state
/// </summary>
/// <param name="treeNode">tree node</param>
/// <param name="checkboxState">checkbox state</param>
private void SetTreeNodeState(TreeNode treeNode, CheckBoxState checkboxState)
{
IntPtr hWnd;
TVITEM tvi;
hWnd = this.Handle; // Send a TVM_SETIMAGELIST with TVSIL_STATE.
if (!_ImageListSent)
{ SendMessage(hWnd, (UInt32)TVM_SETIMAGELIST, (UInt32)TVSIL_STATE, (UInt32)CheckBoxStateImageList.Handle); _ImageListSent = true;
} // The following uses the TVM_SETITEM message to set the State
// of a given item. It uses the TVITEM structure. // tvi.mask: include TVIF_HANDLE and TVIF_STATE
tvi.mask = TVIF_HANDLE | TVIF_STATE; // To use the State image, tvi.State cannot be 0.
//Setting it to 1 means to use the second image in the image list.
tvi.state = (uint)checkboxState;
// Left shift 12 to put info in bits 12 to 15
tvi.state = tvi.state << 12;
// Set StateMask. -This is required to isolate State above.
tvi.stateMask = TVIS_STATEIMAGEMASK; // Define the item we want to set the State in.
tvi.hItem = treeNode.Handle; //For example, try the root. // Initialize the rest to zero.
tvi.pszText = (IntPtr)0;
tvi.cchTextMax = 0;
tvi.iImage = 0;
tvi.iSelectedImage = 0;
tvi.cChildren = 0;
tvi.lParam = (IntPtr)0; // Send the TVM_SETITEM message.
// TVM_SETITEM = 4365
SendMessage(hWnd, (UInt32)TVM_SETITEM, (UInt32)0, ref tvi); //Set Node State
SetNodeState(treeNode, checkboxState);
}
请问VB.NET可以用这种方法吗?
可以用的话,劳驾把它转成VB.NET代码,在此先谢谢了!
摘要: 包含异步加载树,带拖动,多选,动画效果等控件(文章及相关代码搜集自网络,仅供参考学习,版权属于原作者! ). 阅读全文
感觉好复杂哦!(比起5楼的代码)
正在研究......
要学的东西还真多
再次谢谢peterb!