樹視圖由一些節點
回答
在你所示的代碼,你正在處理的圖紙自己所有的類型爲5或6。對於類型的其他節點,你只是使系統以默認方式繪製節點。這就是爲什麼他們都有預期的線條,但你自己畫畫的那些卻沒有:你忘了畫線了!你看,當你說e.DrawDefault = false;
它假設你確實是這個意思。沒有任何常規繪圖,包括標準線。
你可能需要自己畫這些線,或者找出沒有所有者繪圖的方法。
從您現在使用的代碼中,您似乎試圖在您的所有者繪製代碼中儘可能模擬系統的原生繪製樣式,因此我不清楚自己繪製的東西首先。如果你只是想讓複選框不顯示類型5和6的節點(像線條一樣,因爲你沒有繪製它們而沒有被繪製),所以有一種簡單的方法可以在不涉及所有者的情況下做到這一點畫畫。
所以,你問,什麼是更簡單的方法來隱藏單個節點的複選框?那麼,事實證明TreeView
控件本身實際上支持這一點,但該功能並未在.NET Framework中公開。你需要P/Invoke並調用Windows API來獲取它。下面的代碼添加到您的表單類(請確保您添加了一個using
聲明System.Runtime.InteropServices
):
private const int TVIF_STATE = 0x8;
private const int TVIS_STATEIMAGEMASK = 0xF000;
private const int TV_FIRST = 0x1100;
private const int TVM_SETITEM = TV_FIRST + 63;
[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]
private struct TVITEM
{
public int mask;
public IntPtr hItem;
public int state;
public int stateMask;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpszText;
public int cchTextMax;
public int iImage;
public int iSelectedImage;
public int cChildren;
public IntPtr lParam;
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam,
ref TVITEM lParam);
/// <summary>
/// Hides the checkbox for the specified node on a TreeView control.
/// </summary>
private void HideCheckBox(TreeView tvw, TreeNode node)
{
TVITEM tvi = new TVITEM();
tvi.hItem = node.Handle;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = 0;
SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
}
所有的頂部的凌亂的東西是你的P/Invoke聲明。您需要少數幾個常量,描述樹形視圖項目屬性的TVITEM
structure和SendMessage
function。底部是您實際打電話的功能(HideCheckBox
)。您只需傳入TreeView
控件和要從中刪除複選標記的特定TreeNode
項目。
所以,你可以從每個子節點取消複選標記得到的東西,看起來像這樣:
這是非常好的!我所做的唯一修改是隻通過TreeNode
而不是TreeView
到HideCheckBox
方法。該TreeView
可以從TreeNode
本身檢索:
TreeView tvw = node.TreeView;
使用TreeViewExtensions。
用法示例:
private void MyForm_Load(object sender, EventArgs e)
{
this.treeview1.DrawMode = TreeViewDrawMode.OwnerDrawText;
this.treeview1.DrawNode += new DrawTreeNodeEventHandler(arbolDependencias_DrawNode);
}
void treeview1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
if (e.Node.Level == 1) e.Node.HideCheckBox();
e.DrawDefault = true;
}
下面是答案的代碼作爲擴展方法,用這個你可以這樣做:
public static class TreeViewExtensions
{
private const int TVIF_STATE = 0x8;
private const int TVIS_STATEIMAGEMASK = 0xF000;
private const int TV_FIRST = 0x1100;
private const int TVM_SETITEM = TV_FIRST + 63;
[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]
private struct TVITEM
{
public int mask;
public IntPtr hItem;
public int state;
public int stateMask;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpszText;
public int cchTextMax;
public int iImage;
public int iSelectedImage;
public int cChildren;
public IntPtr lParam;
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam,
ref TVITEM lParam);
/// <summary>
/// Hides the checkbox for the specified node on a TreeView control.
/// </summary>
public static void HideCheckBox(this TreeNode node)
{
TVITEM tvi = new TVITEM();
tvi.hItem = node.Handle;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = 0;
SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
}
}
的[我要尋找的ownerdrawn樹視圖一個很好的資源
- 1. 禁用樹視圖節點
- 2. 樹視圖節點禁用
- 3. 樹視圖節點重選
- 4. 一個節點時,在樹視圖
- 5. 樹視圖樹節點複製
- 6. jQuery的樹視圖點擊節點或+
- 7. HTML編碼asp.net樹視圖節點
- 8. 樹視圖節點的深度複製
- 9. 保持樹視圖和節點分離
- 10. 樹視圖選擇的節點問題
- 11. Telerik的MVC - 樹視圖 - 子節點
- 12. 劍道樹視圖展開節點
- 13. 樹視圖添加節點問題
- 14. GTK#樹視圖 - 如何子節點
- 15. 樹視圖中的不可選節點
- 16. 事件如果在節點的一些樹節點被集中
- 17. 將圖像添加到樹視圖中的僅一個節點
- 18. 如何找到如果選定節點是樹視圖的第一個節點
- 19. 刪除站點地圖樹視圖的根節點
- 20. 如何重命名樹視圖節點或使用javascript更改樹視圖節點
- 21. 在c#winforms中填充樹視圖後排序樹視圖的子節點
- 22. 每當樹節點上點擊一下樹節點
- 23. 只保留一個li節點在樹視圖中顯示
- 24. 將選定的樹視圖節點附加到另一個div
- 25. 在VB6樹視圖中創建一個節點斜體
- 26. 從另一個樹視圖訪問treeview節點的值
- 27. D3樹圖節點順序
- 28. 防止節點上的某些類型的節點Primefaces樹
- 29. Drupal的:路由節點的鏈接到一個視圖
- 30. Asp.net樹視圖 - 當點擊同一個節點時沒有觸發事件
可能重複](http://stackoverflow.com/questions/4179522/i-am-looking-for-a-good-resource-on-ownerdrawn-treeviews) – 2011-01-28 09:44:57
我同意漢斯;業主抽籤通常非常困難。如果你堅持,我發現了一個更完整的自繪樹視圖樣本,作爲[這個問題]的答案給出(http://stackoverflow.com/questions/1003459/c-treeview-owner-drawing-with-ownerdrawtext-和怪異的黑色突出顯示wh/1004087),完成與節點線。 – 2011-01-28 09:54:34