سؤال

وأنا بحاجة إلى أن تكون قادرة على تعطيل بعض مربعات في عنصر تحكم TreeView من تطبيق WinForms عناصر، ولكن ليس هناك مثل وظيفة مدمجة في عنصر تحكم TreeView القياسية.

وأنا بالفعل استخدام الحدث TreeView.BeforeCheck وإلغائه إذا هي عقدة المعاقين والذي يعمل على ما يرام تماما.

وأنا أيضا تغيير ForeColor من العقد المعوقين إلى GrayText.

هل لديها حل بسيط وقوي؟

هل كانت مفيدة؟

المحلول

ومنذ هناك دعم في C ++ نتمكن من حلها باستخدام ف / استدعاء.

وهنا الإعداد لف / استدعاء جزئيا فقط جعلها متاحة للطبقة الاستدعاء.

    // constants used to hide a checkbox
    public const int TVIF_STATE = 0x8;
    public const int TVIS_STATEIMAGEMASK = 0xF000;
    public const int TV_FIRST = 0x1100;
    public const int TVM_SETITEM = TV_FIRST + 63;

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam,
    IntPtr lParam); 

    // struct used to set node properties
    public 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;

    } 

ونحن نريد لتحديد على عقدة أساس كل عقدة. أسهل طريقة لذلك هي على الحدث عقدة التعادل. لدينا لوضع شجرة جهدنا لتكون على النحو مالك رسمها من أجل هذا الحدث، حتى يكون على يقين من أن تعيين هذا إلى شيء آخر من الإعداد الافتراضي.

this.tree.DrawMode = TreeViewDrawMode.OwnerDrawText;
this.tree.DrawNode += new DrawTreeNodeEventHandler(tree_DrawNode);

في وظيفة tree_DrawNode الخاص بك تحديد ما إذا كان من المفترض عقده الانجرار لديها مربع، وإخفائه عندما approriate. ثم تعيين الافتراضي رسم الملكية إلى true لأننا لا نريد أن تقلق حول رسم كل تفاصيل أخرى.

void tree_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
    if (e.Node.Level == 1)
    {
        HideCheckBox(e.Node);
        e.DrawDefault = true;
    }
    else 
    {
        e.Graphics.DrawString(e.Node.Text, e.Node.TreeView.Font,
           Brushes.Black, e.Node.Bounds.X, e.Node.Bounds.Y);
    }
}

وأخيرا، والدعوة الفعلية إلى وظيفة حددنا:

private void HideCheckBox(TreeNode node)
{
    TVITEM tvi = new TVITEM();
    tvi.hItem = node.Handle;
    tvi.mask = TVIF_STATE;
    tvi.stateMask = TVIS_STATEIMAGEMASK;
    tvi.state = 0;
    IntPtr lparam = Marshal.AllocHGlobal(Marshal.SizeOf(tvi));
    Marshal.StructureToPtr(tvi, lparam, false);
    SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, lparam);
}

نصائح أخرى

وTreeView.BeforeCheck - تسجيل لهذا الحدث، والتحقق ما إذا كانت العقدة هي واحدة حيث يسمح خانات الاختيار ليتم التحقق أم لا، وإذا كان لا يمكن التحقق من ثم يمكنك إلغاء الحدث عن طريق تعيين خاصية الغاء على TreeViewCancelEventArgs . يجب أن نأمل منع المستخدم من فحص تلك الصناديق ولكن لن يجعل للحصول على أفضل تجربة المستخدم.

لإزالة مربعات الاختيار للعناصر غير قابلة للتحديد، هل يمكن ربما استخدام مالك التعادل لرسم مستطيل الصلبة الإفراط في خانة الاختيار لحذفها.

وليس هناك ما يحمل في ثناياه عوامل للقيام بذلك. يمكنك استخدام الحدث BeforeCheck وإلغائه للعقد المرجوة. في حالة ظهور مربع الأمور، فإنك سوف تحتاج إلى وضع صورة هناك لإظهار مربع تعطيل.

وهذا <وأ href = "http://groups.google.com/groups؟as_q=treeview+checkbox&num=10&scoring=r&hl=en&as_epq&as_oq&as_eq&as_ugroup&as_usubject&as_uauthors=claes+bergefall&lr&as_drrb=q&as_qdr&as_mind=1&as_minm=1&as_miny=1981&as_maxd=12&as_maxm=6&as_maxy=2006&safe = إيقاف وPLI = 1 "يختلط =" نوفولو noreferrer "> قد يكون الارتباط اهتمامك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top