WinForm控制項TreeView 只部分節點顯示 CheckBox

來源:互聯網
上載者:User

標籤:

WinForm控制項TreeView 只部分節點顯示  CheckBox

 

用過asp.net的應該知道,要在treeview中實現上述功能可以使用ShowCheckBox 屬性指定那些節點顯示checkbox哪些不顯示,可是winform中的treeview只提供一個ShowCheckBoxes 屬性,要麼全部節點顯示checkbox,要不全部不顯示,而指定節點沒有ShowCheckBox 屬性,下面就在winform的treeview中實現BS對應CheckBox 屬性的功能 

方法1:

a)       將TreeView的CheckBoxs屬性設為false

b)      將TreeView的StateImageList屬性關聯一個imagelist組件,裡面添加checkbox勾選圖片和未勾選圖片

c)      添加TreeView的NodeMouseClick事件,在事件中使用e.Node.StateImageIndex屬性切換顯示的圖片(根據索引切換),可以建立一個泛型集合,比如List<string>,用於存放已打鉤的節點項,從而方便切換打鉤圖片索引和未打鉤圖片索引

d)      缺點: 點擊樹節點所在行的任何位置都會觸發NodeMouseClick事件,因為無法觸發treeView1_AfterCheck和treeView1_NodeMouseClick事件,所以只能用NodeMouseClick事件

e)       原理: winform中treeview的checkbox項其實是使用圖片顯示的,選中是打鉤的圖片,未選中是未打鉤的圖片,關聯的是StateImageList屬性(預設為空白,使用內建的圖片)。所以如果要實現指定treenode顯示checkbox,其它treenode不顯示checkbox就需要使用TreeNode的StateImageList屬性

 

方法2(建議):

  1:初始化:

this.treeView1.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
this.treeView1.DrawNode += new System.Windows.Forms.DrawTreeNodeEventHandler(this.treeView_DrawNode);

:2: 設定條件控制需要顯示checkbox

private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
//隱藏節點前的checkbox
if (e.Node.ImageIndex <2)//此處設定前2級節點不顯示選擇框
HideCheckBox(this.treeView1, e.Node);
e.DrawDefault = true;
}

3:

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;
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);

}

[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);

 

 

//填充內容的代碼略

 

就實現了 只顯示部分checkbox

 

WinForm控制項TreeView 只部分節點顯示 CheckBox

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.