Steuerelement, Control, Proberties

paranoid_2

Grünschnabel
Hallo,

bin gerede dabei meine eigene Steuerelmentsammlung zu erstellen. Diese haben natürlich ein überarbeitetes Design (Das man einstellen kann: Klassik oder NewStyle). Damit, wenn man mehrere Elemente in einer Form (oder auch im ganzen Programm) nutzt, alle auch das gleiche Design haben, hab ich mir überlegt eine Komponente zu erstellen die das erledigt.
So stellt man nur über dieses Element das Design meiner Steuerelementsammlung ein.

Damit es auch für andere Nutzer schnell im Editor von VS nutzbar ist, hab ich mir gedacht, dass sich die Design-Klasse als Steuerelement anlegen lässt.

So soll diese Klasse in der Toolbox von VS erscheinen und wenn man sie dann per Drag and Drop aufs Programm zieht, soll sie nicht grafisch (im gegensatz wei Button, TextBox...) erscheinen sondern als Element in einer Liste wie z.B. das OpenFileDialog, das ja unterhalb der Form angezeigt wird.

Weis jemand wie es geht

Danke schon mal im Voraus.
 
Hi,

Bzgl. Properties im Grid:
Zu dem Thema gibt es schon einige Threads hier im Forum.:google:

Bzgl. Anzeige in "Liste"
Was du suchst nennt sich Component.
Deine Klasse muss also von IComponent erben
 
Hab mich falsch ausgedrückt. Die Properties hab ich ja schon. War mein Fehler. SORRY. hätte mich präziser ausdrücken müssen.

Wollte nur das mit der Liste wissen.

Hab jetzt meine Klasse IComponent erben lassen, dann hab ich die zusätzlichen Methoden generieren lassen (ISite..). Aber wenn ich jetzt die Klasse auf eine Form ziehe kommt der Fehler:

"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt".

Muss ich vielleicht noch was dazu "codieren"? Also in der Hilfe von VS steht nix genaueres.
 
Hi,

Machst du im Konstruktor der Komponent was bestimmtes?
Also hat der einen Parameter, der benötigt wird. Wenn ja, implementier noch einen Standardkonstruktor, so dass der im Designer aufgerufen werden kann

'//EDIT
bzw. pass deinen bisherigen Konstruktor so an, dass er keine Exceptions wirft
 
Mein Konstruktor wird nicht benutzt!

aber sieh selbst:

Code:
namespace ControlsPlus
{
	public class ControlDesigner : Control, IComponent
	{
		#region Variables

		private Enumeration.CustomBorderStyle borderStyle = Enumeration.CustomBorderStyle.Flat;
                ...

		#endregion // Variables

		#region Contstructor

		public ControlDesigner()
		{
            
		}

		#endregion // Constructor

		#region Proberties	

		[Browsable(true)]
		[Category("Appearance")]
		[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
		public Enumeration.CustomBorderStyle BorderStyle
		{
			get { return borderStyle; }
			set { borderStyle = value; }
		}

                 ...

		#endregion // Proberties

        #region IComponent Member

        event EventHandler IComponent.Disposed
        {
            add {  }
            remove {  }
        }

        ISite IComponent.Site
        {
            get
            {
                //throw new Exception("The method or operation is not implemented.");
                return null;
            }
            set
            {
                //throw new Exception("The method or operation is not implemented.3");
            }
        }

        #endregion // IComponent Member

        #region IDisposable Member

        void IDisposable.Dispose()
        {
            //throw new Exception("The method or operation is not implemented.4");
        }

        #endregion // IDisposable Member
    }
}
 
Bin mal wieder dazu gekommen mich diesem Problem zu stellen und bin dann auch auf eine Lösung gekommen.

Mein Problem war, dass ich noch von Control geerbt habe und deshalb kam es nicht zur gewünschten anzeige.

Mein Code:

Code:
using System;
using System.Windows.Forms;
using System.ComponentModel;

namespace ControlsPlus
{
  public class ControlDesigner : IComponent
  {
    private ISite site = null;
    ...

   private void OnDisposed(EventArgs e)
   {
     EventHandler handler = Disposed;

      if (handler != null)
      {
        handler(this, e);
      }
    }

  public event System.EventHandler Disposed;

  public ISite Site
  {
    get
    {
      return site;
    }
    set
    {
      site = value;
    }
  }

  public void Dispose()
  {
    OnDisposed(EventArgs.Empty);
  }

Ein weiteres Beispiel ist auf: http://www.codeproject.com/cs/miscctrl/lescsmultimediatimer.asp
 
Zurück