2012-05-03 15 views
7

मानक WinForms 2.0 PropertyGrid control होने के बाद मैं नियंत्रण के सीमा रंग को बदलने या पूरी तरह से सीमा को हटाने का एक तरीका ढूंढ रहा हूं।एक संपत्ति ग्रिड नियंत्रण के सीमा रंग (या सीमा को हटाएं) को कैसे बदलें?

enter image description here

मैं LineColor property जो दुर्भाग्य से केवल कोशिकाओं के बीच आंतरिक बॉर्डर में परिवर्तन के बारे में पता कर रहा हूँ।

साथ ही, मैं ILSpy इस्तेमाल किया PropertyGrid नियंत्रण के स्रोत कोड पर एक नज़र लेने के लिए और अभी भी मेरे लिए सार्थक कुछ नहीं मिला।

मेरा प्रश्न है:

कैसे एक PropertyGrid नियंत्रण की बाहरी सीमा हटाने या बाहरी सीमा का रंग बदलने के लिए?

अद्यतन 2012-05-04 - समाधान (उर्फ "हैक"):

enter image description here

विचार करने के लिए है:

Jamie's answer के आधार पर मैं एक काम कर समाधान (which you can download from here) इकट्ठे एक पैनल के अंदर संपत्ति ग्रिड रखें और पैनल को नियंत्रण क्लिप करने दें।

इस दृष्टिकोण के साथ

, मैं जगह "1" (या आप सीमाओं होना चाहते हैं जो कुछ भी) एक और पैनल के एक Padding है कि में कतरन पैनल किया था और इस पैनल के एक BackColor कि सीमा रंग रूप में कार्य करता है (हरी दे दी है मेरा उदाहरण)।

संपत्ति ग्रिड के लिए "वाम, ठीक है, ऊपर, नीचे", कतरन पैनल को "पूर्ण" के Dock सेट की एंकर सेट करें।

enter image description here

यह मेरी आवश्यकताओं के लिए अच्छी तरह से काम करता है। मैं इसे एक हैक के रूप में देखता हूं क्योंकि यह दो पैनलों के संसाधनों का उपभोग करता है, जिन्हें मैं उम्मीद करता था कि मैं बचा सकता हूं।

उत्तर

2

इस एक और विकल्प नहीं है के रूप में ऐसा लगता है कि मेरा पहला जवाब इस विशेष नियंत्रण के लिए उपयुक्त नहीं है। यह एक गंदे चाल है लेकिन काम करना चाहिए:

अपनी विंडो या संवाद में एक पैनल नियंत्रण रखें, आकार 100 एच x 300V के साथ कहें। स्थिति -1, -1 और आकार 102,302 के साथ पैनल के अंदर संपत्तिग्रस्त रखो।

+0

हेहे, मैंने पहले से ही कोशिश की है कि अतीत में, असफल। मैं इसे फिर से कोशिश करूंगा, बस अगर मैंने कुछ गलत किया है। –

+0

@ जैमी यह काम किया, आपके सुझाव के लिए धन्यवाद! मैं आपके प्रश्न के साथ अपना प्रश्न अपडेट करूंगा। –

+1

सावधान रहें, स्वचालित रूप से स्केलिंग के कारण विंडोज़ का आकार बदलते समय यह बाइट कर सकता है। आप वास्तव में यह सुनिश्चित करने के लिए पैनल के आकार बदलने वाले ईवेंट हैंडलर में कोड लिखना चाहते हैं कि यह संपत्तिग्रिड है जहां यह होना चाहिए। –

1

आपको लगता है कि के लिए इंटरॉप का एक सा की आवश्यकता होगी:

[DllImport("User32", CharSet=CharSet.Auto)] 
private static extern int SetWindowLong(IntPtr hWnd, int Index, int Value); 
[DllImport("User32", CharSet=CharSet.Auto)] 
private static extern int GetWindowLong(IntPtr hWnd, int Index); 

int GWL_STYLE = -16; 
int WS_BORDER = 0x00800000; 
IntPtr hWnd = yourPropertyGrid.Handle; 

int style = GetWindowLong(hWnd, GWL_STYLE); 
style = style & ~WS_BORDER; 
SetWindowLong(hWnd, GWL_STYLE, style); 
+0

धन्यवाद, @Jamie मैं इस की कोशिश की, लेकिन दुर्भाग्य से शैली पहले से ही शैली को छोड़ देते हैं, इस प्रकार इसे हटाने, परिवर्तन नहीं करता है लगता है। क्या आपने अपना समाधान करने की कोशिश की है और यह काम कर रहा है? –

+1

हाय उवे, नहीं, मैंने कोशिश नहीं की है, यह देशी विंडोज नियंत्रण की सीमा को हटाने का एक मानक तरीका है। ऐसा लगता है कि संपत्तिग्रस्त इस मानक का पालन नहीं कर रहा है, इसलिए, मुझे लगता है कि आप इसे इस तरह से करने में सक्षम नहीं होंगे। –

0

यह कोड काम करता है।

private void SetHelpBoderColor(bool showBorder) 
{ 
    if (showBorder) 
    { 
     //Set Default ViewBackColor 
     PropertyInfo viewBackColor = this.propertyGrid.GetType().GetProperty("ViewBorderColor"); 
     if (viewBackColor != null) 
      viewBackColor.SetValue(this.propertyGrid, SystemColors.ControlDark, null); 

     //Set Default HelpBorderColor 
     PropertyInfo helpBorderColor = this.propertyGrid.GetType().GetProperty("HelpBorderColor"); 
     if (helpBorderColor != null) 
      helpBorderColor.SetValue(this.propertyGrid, SystemColors.ControlDark, null); 

    } 
    else 
    { 
     //Set ViewBackColor 
     PropertyInfo viewBackColor = this.propertyGrid.GetType().GetProperty("ViewBorderColor"); 
     if (viewBackColor != null) 
      viewBackColor.SetValue(this.propertyGrid, SystemColors.Control, null); 

     //Set HelpBorderColor 
     PropertyInfo helpBorderColor = this.propertyGrid.GetType().GetProperty("HelpBorderColor"); 
     if (helpBorderColor != null) 
      helpBorderColor.SetValue(this.propertyGrid, SystemColors.Control, null); 
    } 

    if (DesignMode) 
    { 
     Parent.Refresh(); 
    } 
} 
+1

यह कोड क्यों काम करता है? –

+0

हां, वह कोड PropertyGrid में ViewBoder और हेल्पबोडर को दिखा या छुपा सकता है। – TrungNV

2

यहाँ मेरी परियोजना से कोड है

PropertyGrid दो नियंत्रण प्रक्रिया की आवश्यकता है।
+ दस्तावेज दस्तावेज़ सहायता है।
+ ग्रिड व्यू जो संपत्ति मूल्य प्रदर्शित करता है।

वे नियंत्रण रंग नियंत्रण रेखा के साथ सीमा आयत खींचते हैं।

हमें स्पष्ट दृश्य बनाने के लिए हेल्पबैककॉलर और लाइनकॉलर के साथ आयत को फिर से खींचना चाहिए।

namespace Bravo.Bravo7.UI 
    { 
     public class MyPropertyGrid : PropertyGrid 
     { 
      public class SnappableControl : NativeWindow 
      { 
       private Control _parent; 
       private MyPropertyGrid _ownerGrid; 

       public SnappableControl(Control parent, MyPropertyGrid ownerGrid) 
       { 
        _parent = parent; 
        _parent.HandleCreated += _parent_HandleCreated; 
        _parent.HandleDestroyed += _owner_HandleDestroyed; 

        _ownerGrid = ownerGrid; 
       } 

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

        switch (m.Msg) 
        { 
         case (int)NativeMethods.WM_NCPAINT: 
         case (int)NativeMethods.WM_PAINT: 

          using (var g = _parent.CreateGraphics()) 
          { 
           using (var pen = new Pen(_ownerGrid.HelpBackColor)) 
           { 
            var clientRectangle = _parent.ClientRectangle; 
            clientRectangle.Width--; 
            clientRectangle.Height--; 
            g.DrawRectangle(pen, clientRectangle); 
           } 
          } 

          break; 
        } 
       } 

       void _owner_HandleDestroyed(object sender, EventArgs e) 
       { 
        ReleaseHandle(); 
       } 

       void _parent_HandleCreated(object sender, EventArgs e) 
       { 
        AssignHandle(_parent.Handle); 
       } 
      } 

      public class PropertyGridView : NativeWindow 
      { 
       private Control _parent; 
       private MyPropertyGrid _ownerGrid; 

       public PropertyGridView(Control parent, MyPropertyGrid ownerGrid) 
       { 
        _parent = parent; 
        _parent.HandleCreated += _owner_HandleCreated; 
        _parent.HandleDestroyed += _owner_HandleDestroyed; 

        _ownerGrid = ownerGrid; 
       } 

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

        switch (m.Msg) 
        { 
         case (int)NativeMethods.WM_NCPAINT: 
         case (int)NativeMethods.WM_PAINT: 

          using (var g = _parent.CreateGraphics()) 
          { 
           using (var pen = new Pen(_ownerGrid.LineColor)) 
           { 
            g.DrawRectangle(pen, 0, 0, _parent.Width - 1, _parent.Height - 1); 
           } 
          } 

          break; 
        } 
       } 

       void _owner_HandleDestroyed(object sender, EventArgs e) 
       { 
        ReleaseHandle(); 
       } 

       void _owner_HandleCreated(object sender, EventArgs e) 
       { 
        AssignHandle(_parent.Handle); 
       } 
      } 

      public class MyToolStripRenderer : ToolStripSystemRenderer 
      { 
       protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) 
       { 
        //base.OnRenderToolStripBorder(e); 
       } 
      } 

      public MyPropertyGrid() 
      { 
       base.LineColor = SystemColors.Control; 
       base.ViewBackColor = Color.FromArgb(246, 246, 246); 

       base.DrawFlatToolbar = true; 
       base.ToolStripRenderer = new MyToolStripRenderer(); 

       var docDocument = typeof(PropertyGrid) 
        .GetField("doccomment", BindingFlags.NonPublic | BindingFlags.Instance) 
        .GetValue(this) as Control; 

       new SnappableControl(docDocument, this); 

       var gridView = typeof(PropertyGrid) 
        .GetField("gridView", BindingFlags.NonPublic | BindingFlags.Instance) 
        .GetValue(this) as Control; 

       new PropertyGridView(gridView, this); 
      } 

     } 

    } 

Screen Shot

+0

संदर्भ को भी समझाएं –

संबंधित मुद्दे