2013-06-25 4 views
0

Я работаю с winforms в .NET 3.5 используя c#. Теперь я хочу, чтобы добавить TreeView с родительскими узлами и флажками в дочерних узлах ...Как добавить флажок в treeview treeview?

Я завершил создание родительского узла с помощью следующего кода ..

dt = conn.dataTable("select desgn from designation"); 
tvRoles.Nodes.Clear(); 
foreach (DataRow dr in dt.Rows) 
{ 
    TreeNode parent = new TreeNode(); 
    parent.Text = dr[0].ToString(); 
    string value = dr[0].ToString(); 
    parent.Expand(); 
    tvRoles.Nodes.Add(parent); 
    subLevel(parent, value); 
} 

Теперь я хочу добавить флажки в дочерних узлах ..

Можете ли вы мне помочь?

+0

насчет родительского узла? Если вам все равно, вы можете установить 'CheckBoxes = true;' –

ответ

0

Если вы хотите только дочерние узлы имеют флажки, вот решение:

//First, as I said, you have to set treeView.CheckBoxes = true; 
//Second, set treeView.DrawMode = TreeViewDrawMode.OwnerDrawAll; 
//Add this DrawNode event handler and enjoy =) 
private void treeView_DrawNode(object sender, DrawTreeNodeEventArgs e) 
{ 
    if (e.Node.Parent == null)//If the Node is a Parent 
    {     
     int d = (int)(0.2*e.Bounds.Height); 
     Rectangle rect = new Rectangle(d + treeView.Margin.Left, d + e.Bounds.Top, e.Bounds.Height - d*2, e.Bounds.Height - d*2); 
     e.Graphics.FillRectangle(new SolidBrush(Color.FromKnownColor(KnownColor.Control)), rect); 
     e.Graphics.DrawRectangle(Pens.Silver, rect); 
     StringFormat sf = new StringFormat() { LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Center }; 
     e.Graphics.DrawString(e.Node.IsExpanded ? "-" : "+", treeView.Font, new SolidBrush(Color.Blue), rect, sf); 
     //Draw the dotted line connecting the expanding/collapsing button and the node Text 
     using (Pen dotted = new Pen(Color.Black) {DashStyle = System.Drawing.Drawing2D.DashStyle.Dot}) 
     { 
      e.Graphics.DrawLine(dotted, new Point(rect.Right + 1, rect.Top + rect.Height/2), new Point(rect.Right + 4, rect.Top + rect.Height/2)); 
     }    
     //Draw text 
     sf.Alignment = StringAlignment.Near; 
     Rectangle textRect = new Rectangle(e.Bounds.Left + rect.Right + 4, e.Bounds.Top, e.Bounds.Width - rect.Right - 4, e.Bounds.Height); 
     if (e.Node.IsSelected) 
     { 
      SizeF textSize = e.Graphics.MeasureString(e.Node.Text, treeView.Font); 
      e.Graphics.FillRectangle(new SolidBrush(SystemColors.Highlight), new RectangleF(textRect.Left, textRect.Top, textSize.Width, textRect.Height)); 
     } 
     e.Graphics.DrawString(e.Node.Text, treeView.Font, new SolidBrush(treeView.ForeColor), textRect,sf); 
    } 
    else e.DrawDefault = true; 
} 

Чтобы сделать это лучше, вы можете создать свой собственный TreeView, переопределить OnDrawNode (с тем же кодом, как я писал выше) и установите в конструкторе DoubleBuffered=true.

+0

особую благодарность u ... но некоторые проблемы похожи на то, что он не показывает + и - прямоугольники ... есть ли какая-либо идея решить его – Bala

+0

@Bala Я тестировал, и он показал ОК, не могли бы вы дать мне снимок экрана вашего дерева (после применения моего кода)? –

+0

Я не могу опубликовать снимок экрана ... называемый функцией узла узла, как показано ниже ... for (int i = 0; i Bala

0

Вы не можете иметь смешанные состояния флажков на одном и том же TreeView в качестве стандарта, это либо все, либо ничего. Тем не менее, я копаю немного копаться и нашел Disable TreeView Node Checkbox. Это может помочь вам.

-1

Получил мне день, чтобы найти подходящее решение: http://dotnetfollower.com/wordpress/2011/05/winforms-treeview-hide-checkbox-of-treenode/.

Решение наследует treeview и treenode с новыми классами, что вы можете использовать новый класс treenode без флажка. Событие добавлено, чтобы обработать скрытый флажок.

ниже, являются классы, скопированные по ссылке:

/// <summary> 
/// Represents a node with hidden checkbox 
/// </summary> 
public class HiddenCheckBoxTreeNode : TreeNode 
{ 
public HiddenCheckBoxTreeNode() { } 
public HiddenCheckBoxTreeNode(string text) : base(text) { } 
public HiddenCheckBoxTreeNode(string text, TreeNode[] children) : base(text, children) { } 
public HiddenCheckBoxTreeNode(string text, int imageIndex, int selectedImageIndex) : base(text, imageIndex, selectedImageIndex) { } 
public HiddenCheckBoxTreeNode(string text, int imageIndex, int selectedImageIndex, TreeNode[] children) : base(text, imageIndex, selectedImageIndex, children) { } 
protected HiddenCheckBoxTreeNode(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context) { } 
} 

public class MixedCheckBoxesTreeView : TreeView 
{ 
/// <summary> 
/// Specifies the attributes of a node 
/// </summary> 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
public struct TV_ITEM 
{ 
    public int Mask; 
    public IntPtr ItemHandle; 
    public int State; 
    public int StateMask; 
    public IntPtr TextPtr; 
    public int TextMax; 
    public int Image; 
    public int SelectedImage; 
    public int Children; 
    public IntPtr LParam; 
} 

public const int TVIF_STATE   = 0x8; 
public const int TVIS_STATEIMAGEMASK = 0xF000; 

public const int TVM_SETITEMA = 0x110d; 
public const int TVM_SETITEM = 0x110d; 
public const int TVM_SETITEMW = 0x113f; 

public const int TVM_GETITEM = 0x110C; 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, ref TV_ITEM lParam); 

protected override void WndProc(ref Message m) 
{ 
    base.WndProc(ref m); 

    // trap TVM_SETITEM message 
    if (m.Msg == TVM_SETITEM || m.Msg == TVM_SETITEMA || m.Msg == TVM_SETITEMW) 
     // check if CheckBoxes are turned on 
     if (CheckBoxes) 
     { 
      // get information about the node 
      TV_ITEM tv_item = (TV_ITEM)m.GetLParam(typeof(TV_ITEM)); 
      HideCheckBox(tv_item); 
     } 
} 

protected void HideCheckBox(TV_ITEM tv_item) 
{ 
    if (tv_item.ItemHandle != IntPtr.Zero) 
    { 
     // get TreeNode-object, that corresponds to TV_ITEM-object 
     TreeNode currentTN = TreeNode.FromHandle(this, tv_item.ItemHandle); 

     HiddenCheckBoxTreeNode hiddenCheckBoxTreeNode = currentTN as HiddenCheckBoxTreeNode; 
     // check if it's HiddenCheckBoxTreeNode and 
     // if its checkbox already has been hidden 

     if(hiddenCheckBoxTreeNode != null) 
     { 
      HandleRef treeHandleRef = new HandleRef(this, Handle); 

      // check if checkbox already has been hidden 
      TV_ITEM currentTvItem = new TV_ITEM(); 
      currentTvItem.ItemHandle = tv_item.ItemHandle; 
      currentTvItem.StateMask = TVIS_STATEIMAGEMASK; 
      currentTvItem.State  = 0; 

      IntPtr res = SendMessage(treeHandleRef, TVM_GETITEM, 0, ref currentTvItem); 
      bool needToHide = res.ToInt32() > 0 && (currentTvItem.State & currentTvItem.StateMask) != 0; 

      if (needToHide) 
      { 
       // specify attributes to update 
       TV_ITEM updatedTvItem = new TV_ITEM(); 
       updatedTvItem.ItemHandle = tv_item.ItemHandle; 
       updatedTvItem.Mask  = TVIF_STATE; 
       updatedTvItem.StateMask = TVIS_STATEIMAGEMASK; 
       updatedTvItem.State  = 0; 

       // send TVM_SETITEM message 
       SendMessage(treeHandleRef, TVM_SETITEM, 0, ref updatedTvItem); 
      } 
     } 
    } 
} 

protected override void OnBeforeCheck(TreeViewCancelEventArgs e) 
{ 
    base.OnBeforeCheck(e); 

    // prevent checking/unchecking of HiddenCheckBoxTreeNode, 
    // otherwise, we will have to repeat checkbox hiding 
    if (e.Node is HiddenCheckBoxTreeNode) 
     e.Cancel = true; 
} 

}