Laden...

Forenbeiträge von Phaiax Ingesamt 56 Beiträge

14.09.2008 - 19:52 Uhr

Damit man sich vielleicht besser vorstellen kann, wie mein UserControl aussieht, hab ich im Anhang einen Screenshot.

Desweiteren habe ich inzwischen ein neues Wunschfeature: Wörter sollten immer an der selben stelle auftauchen.
Wäre es möglich, einen Zufallsgenerator zu benutzen, den man mit einem aus dem Wort berechnen Wert initialisiert?

14.09.2008 - 17:18 Uhr

Zu den Schriftarten:
Ja, es gibt schriftarten mit gleicher länge für jeden Buchstaben. Die heißen MonoSpace-Schriftarten.
Laut Wikip beispielsweise: Courier, Bitstream Vera, Monaco und Letter Gothic.

Andere Herangehensweise (kein Plan, ob das überhaupt möglich ist)
Du kannst auch versuchen die OnPaint-Mehtode zu überschreiben (oder Event OnPaint) und die zweite spalte erst in der OnPaint-Methode einzufügen. Das erste derzeit sichtbare Element kannst du mit irgendeiner Eigenschaft im Checkbox-listcontrol abrufen

14.09.2008 - 17:12 Uhr

Hallo zusammen.

Ich will mir ein UserControl basteln und hänge gerade etwas an der Umsetzung.
Das Control sieht folgendermaßen aus:

In dem Control stehen 3 Hauptbegriffe, jeweils akzentuiert in farblich passenden Kästchen. Der erste Begriff steht (derzeit) oben links, der zweite oben rechts und der dritte unten in der Mitte.

Nun sollen Wörter, die zu jeweils einem Begriff gehören, in einer "chaotischen" Wolke um die jeweiligen Hauptbegriffe angeordnet werden. Die Wörter stehen einfach so (ungerahmt) in dem Control herum. Die Wörter sollten sich nicht überschneiden. Sollte ich mehr Wörter als Platz haben, kann ich die selterer benutzten Wörter auch in einer Dropdown-Box oder etwas ähnlichem auslagern.
Die Größe des Controls ist von der Fenstergröße abhängig, deshalb passen mal mehr und mal weniger Wörter um einen Hauptbegriff. Das heißt ich brauche einen dynamischen Algorithmus und nichts statisches. Die Wörter sollen später farblich ihrem Begriff angepasst werden, deshalb muss zwischen zwei Wörtern, die zu zwei unterschiedlichen Hauptbegriffen gehören kein besonders großer Abstand vorhanden sein. Die Hauptbegriffe sind statisch, die umliegenden Wörter nicht (Anzahl und Text variiert 🙂 ).

Und jetzt: Wie stelle ich das an?

Meine Vorstellungen:
a) Jemand hier kennt einen super Algorithmus, der sehr schnell die perfekte Ausrichtung eines jeden Worts ausrechnen kann. Den muss ich nur noch einbauen und fertig ist 🙂
b) Alle Wörter zu einem Begriff zufällig um den jeweiligen Begriff positionieren. Dann per Algorithmus die Wörter soweit auseinanderschieben, bis sich nichts mehr überschneidet
c) Mit einem Wort anfangen, möglichts nah am Begriff anfangen, dann zum nächsten Wort die nächstegelegene Position nehmen, usw...

Da das Programm, zu dem dieses Control gehört, auch noch aus anderen Dingen besteht, will ich mich eigentlich nicht länger als nötig an diesem Control aufhalten. 🙂

Für Tipps, Erklärungen, Eingebungen, Anstöße und sonstige Einwürfe zum Thema bin ich sehr dankbar!

Grüße, Phaiax

28.09.2007 - 12:19 Uhr

fertig????

20.07.2007 - 10:45 Uhr

Ich würde für Erstmal zwei Klassen erstellen: Die erste entspricht der IP und die zweite Klasse den Feldern.

Es kommt zum einen auf die Datenstruktur deiner Textdatei an und zum anderen, wie du darauf zugreifen willst.

Mit

List<IP> Collection;

und

class IP
{
List<Dataobject> Dataobjects;
string IP;
}

kannst du mit einem Numerischen Index auf die Elemente zugreifen. Die Reihenfolge bleibt dabei erhalten.

Wenn jede IP einmalig ist, könntest du auch ein Dictionary mit einer List kombinieren:

Dictionary<string, List<Dataobject>> IPs;

Willst die Daten in den Unteren Kästchen einzelnd und ohne Typenspezifizierung speichern, weil es nicht immer die selben Felder sind, kannst du sowas benutzen:

Dictionary<string, List<Dictionary<string,string>>> IPs;
           IP      Datenkästen    Typ    Wert

Das berte wär ein Ausschnitt aus deiner Datei, dann kann man dir am Besten helfen....

// Jetzt hab ich wohl zu lang gebraucht, diesen Text zu schreiben ..... 😁

13.07.2007 - 22:58 Uhr

Ich hätte nicht gedacht, dass eine kleine Filterfunktion so schwer werden könnte. Ich Hatte erst versucht, immer von einer Kopie des Orginalknotens die nicht benötigten Knoten zu löschen, aber dass ging nicht, da bei jedem löschen die Enumeration (foreach) verschoben wurde.

Jetzt hab ich eine for-Schleife gebaut, die das umgehen kann: Hier der Code, vielleicht kann er jemandem einen Denkanstoß bringen:


            // erst Kind-Knoten durchgehen
            for (int i = 0; i < Node.Nodes.Count; i++)
            {
                TreeNode ChildNode = Node.Nodes[i];
                FilterNode(ChildNode);
                if (ChildNode.Parent == null) // Gelöscht, d.h. Index verschiebt sich um eins nach oben
                    i--;
            }

13.07.2007 - 20:13 Uhr

Ist es richtig, dass es keine Möglichkeit gibt, einzelne Treenodes in einem Treeview auszublenden?

Ich will eine Filterfunktion realisieren. Ähnlich dem Startmenü in Vista oder den Lesezeichen im Firefox oder der Winamp-Lieder-Liste.

Um trotzdem Knoten ausblenden zu können könnte ich ja eine Kopie des vollständigen Rootnodes erstellen und dann im "Orginal" die einzelnen Nodes löschen. Gibts wirklich keine bessere Lösung?

09.07.2007 - 12:53 Uhr

Ich glaube, dass mit den Hochkommas geht vielleicht nicht, da er (glaub ich jedenfalls) das Programm über registryeinträge ins Kontextmenü geschleust hat. Da werden die Parameter dann von Windows generiert

09.07.2007 - 12:27 Uhr

Beim Programmaufruf wird bei dir ja ein Array übergeben. Dieses Array ist an jedem leerzeichen gesplittet. Wenn du also einen Pfad mit leerzeichen hast, sieht dein args-Array beispielsweise so aus:


// C:\hallo welt\

args[0] = "C:\hallo";
args[1] = "welt\";

du musst dein Array zusammenfügen und zwischen die einzelnen Elemente ein leerzeichen setzen. Am besten du debuggst mal um zu sehen, wie dein Array aussieht.

07.07.2007 - 00:36 Uhr

Gehts noch weiter?

30.06.2007 - 16:35 Uhr

l.AutoSize = true;
l.MaximumSize = new Size(p.Width, 0);

Meine Antwort war eher etwas geraten. Leider verstehe ich nicht, was deine Frage nach Umbrüchen mit "Beschriftung wie bei Windows-Ordner" zu tun hat? Bei einem Windowsordner wird der zu lange Text doch abgeschnitten und nicht umgebrochen.

30.06.2007 - 10:17 Uhr

wenn du im Label die MaxSize.Width eigenschaft festlegst, bricht der Text automatisch um.

27.06.2007 - 22:58 Uhr

Wenn du mal schaust, was ToInt32 macht, merkst du dass die nicht die Text-Eigenschaft zum Int macht, sondern eine int-Zahl ZURÜCKGIBT. Was macht mal wohl mit dieser zurückgegebenen Zahl?

21.06.2007 - 00:29 Uhr

const int WS_CLIPCHILDREN = 0x2000000;
const int WS_MINIMIZEBOX = 0x20000;
const int WS_MAXIMIZEBOX = 0x10000;
const int WS_SYSMENU = 0x80000;
const int CS_DBLCLKS = 0x8;
protected override CreateParams CreateParams
{
   get
   {
      CreateParams cp = base.CreateParams;

      cp.Style = WS_CLIPCHILDREN | WS_MINIMIZEBOX | WS_SYSMENU;
      cp.ClassStyle = CS_DBLCLKS;

      return cp;
   }
}

von http://www.thescripts.com/forum/thread528760.html
oder
Eigene Form-Klasse
und hier nochmal so ähnlich


protected override System.Windows.Forms.CreateParams CreateParams
{
   get
   {
      CreateParams cp = base.CreateParams;
      const int WS_CLIPCHILDREN = 0x2000000;
      const int WS_MINIMIZEBOX = 0x20000;
      //const int WS_MAXIMIZEBOX = 0x10000;
      const int WS_SYSMENU = 0x80000;

      const int CS_DBLCLKS = 0x8;
      const int CS_DROPSHADOW = 0x20000;

      int ClassFlags = CS_DBLCLKS;
      int OSVER = Environment.OSVersion.Version.Major * 10;
      OSVER += Environment.OSVersion.Version.Minor;
      if (OSVER >= 51) ClassFlags = CS_DBLCLKS | CS_DROPSHADOW;

      cp.Style = WS_CLIPCHILDREN | WS_MINIMIZEBOX | WS_SYSMENU; //| WS_MAXIMIZEBOX
      cp.ClassStyle = ClassFlags;

      return cp;
   }
}

http://www.dotnetrix.co.uk/misc.html bei "An example of a moveable/resizable shaped form."

20.06.2007 - 00:46 Uhr

zu meinem c)

ich versuche das mal genauer zu erklären. Es gibt ja z.B. bei WInamp die Möglichkeit das Programm von außen zu steuern. Dazu sendet man Codes wie 40047 an Winamp, um das aktuell abgespielte Lied anzuhalten.

Hier habe ich mal Beispielcode. Mit meinem Fernbedienungsprogramm kann ich den LParameter und den WParameter von System.Windows.Forms.Message füllen. Den könntest du dann ja auslesen.


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            if (m.WParam == new System.IntPtr(44444))
            {
                MessageBox.Show("Activated");
            }
        }

        public override bool PreProcessMessage(ref Message msg)
        {
            return base.PreProcessMessage(ref msg);
        }
    }

19.06.2007 - 20:12 Uhr

Hallo. Erste Testreihe erfolgreich. Wenn du weitermachst (Tu das bitte!), solltest du
a) Auf InfoIcon minimieren einbauen
b) Global Hotkeys einstellen lassen, auf die dein Programm dann reagiert
c) Auf Systemnachrichten reagieren können (mir fällt die richtige Bezeichnng nicht ein; auf jeden Fall meine ich damit die Systemereignisschleife jedes Programms)

b)+c) sind für die Steuerung per Girder o.ä. (Fernbedienung)
Sonst immernoch großes Lob.

15.06.2007 - 20:50 Uhr

Nice.

Ich werds jetzt auch benutzen, da meine Firewire-Soundkarte sich in Windows als 5 verschiedene Soundkarten anmeldet. Eigentlich bräuchte Windows mal sowas wie Jack unter Linux.

12.06.2007 - 19:48 Uhr

Mir fällt jetzt aus gradwohl nicht dazu ein. Du kannst aber auch das ganze Projekt kopieren und der Reihe nach alles löschen und standartisieren bis es wieder geht. Dann hast du vielleicht eine Ahnung woran es liegen könnte.

12.06.2007 - 19:41 Uhr

Wie ich das machen würde:

Für jede Funktion (= angezeigtes Element im Inhaltsbereich) würde ich eine extra Benutzersteuerelement mit den entsprechenden Elementen anlegen.
Dazu dann so eine Funktion, die in den Hauptmenübutton-click-events aufgerufen wird:

Die einzelnen Bunutzersteuerelemente mit den Funktionen würde ich einfach auf der Form plazieren.

enum Functionlist
{
  Begruessung,
  Taschenrechner,
  Kalender
}

private void ShowFunction(Functionlist f)
{
  if(f == Functionlist.Begruessung)
  {
    CorrectBorders(Begruessung1);
    this.Controls.Add(Begruessung1);
  }
  else
     this.Controls.Remove(Begruessung1);
  // ......
}

private void CorrectBorders(Control C)
{
  // Manuelle Positionierung, da im Designer etwas schwierig
  C.Location = new Point(50,50);
  C.Size = new Size(200,200);
  //C.Anchor = .....
}

02.06.2007 - 14:13 Uhr

AAARRRG, mein Name wurde vergewaltigt 😁 😄^^

Danke, die Seite kenne ich schon. Nur wonach kann ich da suchen? Ich habe schon versucht, andere DateTimePickers zu finden, nur sind die alle vom System.Windows.Forms.DateTimePicker abgeleitet. Das hilft mir leider nicht weiter

02.06.2007 - 13:09 Uhr

Hallo Leute!

Jeder kennt ja das DateTimePicker-Control in .Net2.0. Da wird beim Klick auf das Dropdown-Symbol ein weiteres "dynamisches" Control eingeblendet, mit dem man dann das genaue Datum auswählen kann. Dieses dynamische Control wird unter/über dem eigentlichen Datetimepicker angezeigt. Meine Frage ist jetzt, wie ich ein solches Control erstellen kann.

Anfangs dachte ich, man könnte einfach ein ensprechendes Control erstellen, und das dann in this.Parentform.Controls hinzufügen und entsprechend plazieren.

Wenn man aber mal testweise ein DateTimePicker-Control erstellt und dieses nahe dem unteren Rand der Form plaziert, wird das "dynamische" Control auch über den Rand des Fensters hinaus angezeigt.

Jetzt könnte man natürlich auch eine Form ohne Titelleiste erstellen und diese dann einfach öffnen und entsprechend plazieren. Jetzt ist meine Frage aber, ob es nicht noch eine bessere, einfachere Möglichkeit gibt, so ein "dynamisches" Control anzuzeigen. Leider weis ich nicht, wie man so ein Verhalten nennt und finde deswegen auch nichts mit der Suche.

Grüße
Phaiax 😁

30.04.2007 - 18:37 Uhr

Hallo blackcoin, kannst du mir mal erklähren, was du damit meinst?

kannst dir das ja schon mal anschauen Section 28 && 29

Da versteh ich leider nur Bahnhof.....

26.04.2007 - 14:11 Uhr

Das Problem hatte ich auch mal. Ich glaub, ich habs mit einem Eventhandler auf

Application.ApplicationExit +=new EventHandler(Application_ApplicationExit);

gelöst. Bin mir da aber nicht so sicher.
Im Eventcode wurde dann der Thread beendet.

Vielleicht gehts auch über die FormClosed oder FormClosing-events

23.04.2007 - 21:33 Uhr

oder videodownloader.net

21.04.2007 - 13:40 Uhr

http://www.mentalis.org/soft/class.qpx?id=7


                Org.Mentalis.Utilities.RestartOptions RestartOptions = Org.Mentalis.Utilities.RestartOptions.Shutdown;
                Org.Mentalis.Utilities.WindowsController.ExitWindows(RestartOptions, true/false);


Der Vorteil an diesem Code ist, dass er sich automatisch um benötigte Rechte kümmert.
Ich glaube mich nämlich zu erinnern, dass Process.Start("shutdown.exe ....."); nicht als eingeschränkter Benutzer funktioniert.

10.04.2007 - 21:49 Uhr

Über die Events der Klasse.


Public event  	 DownloadFileCompleted  	Occurs when an asynchronous file download operation completes.
Public event 	DownloadProgressChanged 	Occurs when an asynchronous download operation successfully transfers some or all of the data.

http://msdn2.microsoft.com/en-us/library/system.net.webclient_members.aspx

Statt DownloadFile(x,x) musst du dann DownloadFileAsync(x,x,x) benutzen, da ist sogar der Thread direkt mit drinnen -> viel weniger arbeit

10.04.2007 - 21:43 Uhr

Vielleicht über die Energieverwaltung. Und dann überprüfen woher die Energie kommen kann. Wie das geht und ob man darüber sicher erkennen kann, ob der Computer ein Laptop ist, weis ich allerdings nicht.

28.03.2007 - 12:59 Uhr

edit:Schwachsinn, hab grad deinen Post nicht richtig gelesen.

Hast du das Browsable-Attribut bei MaxLenght angegeben?

22.03.2007 - 14:26 Uhr

Wenn du die Textboxen in deinem Control hast, sind die Textboxen höchstwarscheinlich auch in der Controls-Auflistung deines Usercontrols vorhanden, folglich:

this.deinUserControl1.Controls.-was-du-willst

aber ich würde die Methode besser im UserControl schreiben (kommt drauf an, wie allgemein die Methode ist, bei dir also ja)

der ganze Code wäre dann:


public class deinUserControl
{
........

  public void ClearTextBoxes()
  {
    foreach (Control c in this.Controls)
    {
      if(c is TextBox)
      {
        ((TextBox)c).Text = "";
      }
    }
  }

....
}

21.03.2007 - 14:46 Uhr

Versuch mal, direkt nachdem die Fehlermeldung kam, die KDC.exe mit irgendeiner anderen KDC.exe zu überschreiben

20.03.2007 - 12:33 Uhr

Ohne dass ich mal ASP.NET programmiert habe, man kann doch nicht System.Diagnostics.Process.Start("Iexplore.exe", targetURL); benutzen, da dieser Befehl den Browser doch auf dem Server und nicht im Client öffnet.

17.03.2007 - 16:48 Uhr

this.refresh(); in der Form. Das Programm bzw die Textbox sollte sich aber auch beim setzen der Texteigenschaft neu zeichnen.

17.03.2007 - 16:46 Uhr

Falls der PC nur für diese Aufgabe zuständig ist, kann man doch auch Echtzeit bei der CPU-Priorität im Taskmanager einstellen, oder?

17.03.2007 - 16:42 Uhr

Du bist leider ein Bisschen schwer zu verstehen.

Da du in der Methode start() eine neue Instanz der aForm erstellst, bekommst du per Proxy_obj() natürlich ein Leeres Stringarray geliefert (du hast es warscheinlich noch nicht gefüllt). Um an die Strings der Ursprünglichen Instanz der aForm zu bekommen, musst du bei oThread.Start(object parameter); die Form (this) übergeben und dann bei Start(object xxxxxxx)

  1. xxxxxxx in aForm umwandeln und 2. Proxy_obj() ausführen

Es ist aber viel praktischer, den Backgroundworker aus der Toolbox zu verwenden.

15.03.2007 - 12:38 Uhr

Bei welcher Komponente?

15.03.2007 - 11:34 Uhr

genau blackcoin.

Solltest du doch mal etwas hinzufügen wollen, dann darauf achten, das die Eigenschaften eines Controls alphabetisch sortiert sien müssen. Bei selbstprogrammierten Controls darfst du nicht einfach Eigenschaften oder Events umbenennen. Manchmal passiert sowas auch, wenn du fremde Controls benutzt. Die sind dann warscheinlich unsauber programmiert.

14.03.2007 - 14:52 Uhr

klar, hatt ich ganz vergessen ...

Noch so eine kleine Bemerkung:

Wenn man bei einem Usercontrol schon während der Anzeige im Designer funktionierende Buttons haben will, die Funktion EnableDesignMode() in oben erwähntem ParentControlDesigner benutzen. (nur so als Memo, falls ich mal wieder selbst vor diesem Problem stehe)

13.03.2007 - 21:46 Uhr

na dann... dann arbeite ich erstmal mit den normalen symbolleisten. Ribbon-Style wär zwar schön gewesen, aber dafür fehlt mir die zeit.. wenn jemand sowas basteln will, werd ich vielleicht helfen.....wer Mitarbeit braucht.

13.03.2007 - 21:23 Uhr

Kennt jemand schon eine Bibliothek mit GUI-Elementen wie im neuen Office 2007. Damit meine ich konkret die neuen Symbolleisten:

http://news.softpedia.com/images/reviews/large/MicrosoftOffice2007Beta2_012-large.png

Warscheinlich sind schon ein paar Umsetzungen in Arbeit, oder?

Gruß, Phaiax

13.03.2007 - 21:13 Uhr

So, mit der Problematik hab ich mich auch längere Zeit beschäftigt.

Erstmal einen Verweis auf System.Design

Dann eine Klasse von ParentControlDesigner ableiten (geht vielleicht auch mit ControlDesigner, keine ahnung), z.B. TextBoxGridDesigner

Deine UserControl Deklaration so werweitern:


[Designer(typeof(TextBoxGridDesigner))]
class TextBoxGrid : UserControl
{

}

So sollte die Sache funktionieren.

Allerdings gibts so (glaub ich) kein Rückgängig/Undo in Visual Studio. Ich weiß wies gehen sollte, nur fällts mir grad nicht genau ein. Irgendwas mit Transaction

Diesen kleinen Pfeil kriegst du hin, wenn du die Eigenschaft Verbs überschreibst.

Leider gibts nicht viele Tutorials dazu, aber wenn du nach den richtigen Wörtern suchst, findest du sie.

Ich hab jetzt leider keine Zeit/Lust in meinem Projekt nachzuschauen, wenn du doch mehr wissen willst, frag grad nochmal.

PS:

Wenn dus so machst, werden die Textboxen auch deinem TextBoxGrid zugeordnet.

Also in der Intialisize Methode steht nicht

this.Controls.Add(bla);

sondern

this.TextBoxGrid1.Controls.Add(bla); // steht dann nicht am Ende sondern bei den Eigenschaftszuweisungen des TextBoxGrid1

Hoffe ich konnte dir helfen. Das sollte der richtige Weg sein, wenn ich dich auch richtig verstanden habe

Gruß Phaiax

//edit: c#-code-tags ergänzt!!!

17.01.2007 - 23:26 Uhr

oder du benutzt folgenden Code, dann erscheint der Parameterlose Kostruktor nicht mehr in der Liste (mein gott, mir fällt grad nicht mehr ein, wie die heißt).

Wenn du trotzdem einen parameterlosen Kostruktor benutzt, wird ohne Fehler kompiliert.

        [EditorBrowsable(EditorBrowsableState.Never)]
        public Test()
        {
            InitializeComponent();
        }

16.01.2007 - 19:38 Uhr

ok, ich hab das problem mal gestutzt


    public partial class Test : UserControl
    {
        public Test()
        {
            InitializeComponent();
        }

        public bool MyProperty
        {
            get { return false; }
            set { this.Parent = null; }
        }

    }

Das Problem ist, dass der System.Windows.Forms.Design.BehaviourService nach einem Parent des Testobjekts sucht. Die Parenteigenschaft ist leider null, weshalb der Fokus nicht weitergegeben werden kann. Geht das nicht vielleicht, dass man die Parent bzw ParentInternal-Eigenschaft überschreibt und z.B nur für die nächste Abfrage das zwischengespeicherte, aber alte Parentobject zurückgibt?
Die Eigenschaft Control.ParentInternal gibt es zwar, aber ich kann sie nicht überschreiben. Heist dass, ein Control kann sich zur Entwurfszeit nicht selbst löschen?

01.01.2007 - 13:57 Uhr

Wenn jemand das Projekt zum anschauen haben will, melde er sich bitte bei mir.
Sonst würd mir helfen, wenn mir jemand per Remote Zugriff auf sein Visualstudio geben würde^^ Mit der Express Edition kann ich das was da passiert nämlich nicht debuggen. Schade^^ 😁

30.12.2006 - 21:15 Uhr

Die GUID eines Projekts verstellt man in den Projekteigenschaften -> Reiter "Anwendung" -> Assemblyinformationen

30.12.2006 - 20:37 Uhr

Der Konstruktor der String-Klasse akzeptiert die Klasse Uri nicht.

Du kannst einer String-Eigenschaft/Variable nur einen String zuweisen. Das hast du ja schon versucht, nur so einfach gehts nicht.
Les dir doch mal lieber das Buch durch, dass herbivore dir empfolen hat. Das ist ein Buch, dass man auch online lesen kann (falls dus noch nicht bemerkt hast)

So würde es gehen:

this.toolStripTextBox1.Text = webBrowser1.Url.OriginalString;

this.toolStripTextBox1.Text = webBrowser1.Url.AbsoluteUri;

this.toolStripTextBox1.Text = webBrowser1.Url.AbsolutePath;

Je nachdem, was du erreichen willst

30.12.2006 - 20:17 Uhr

Hallo

Meine Frage lautet: Wie kann man im Entwurfsdesigner (damit meine ich den Bereich, auf dem man mit der Toolbox Komponenten plazieren kann) den Fokus verändern.
Mit Fokus meine ich nicht den Fokus, den man mit diesem Befehl ändert:

Textbox a = new Textbox();
this.Controls.Add(a);
a.Focus();
this.ParentForm.Focus();

sondern den Rahmen, der im Entwurfsmodus um die Komponenten herum angezeigt wird.

Konkret habe ich ein selbsterstelltes Benutzersteuerelement (abgel. von UserControl bzw Panel), das ich mit dem ParentControlDesigner in einen Container verwandelt habe (->hat dann die selbe Funktionalität wie ein Panel). In dieser Komponente werden dynamisch DSplitcontainer(s) hinzugefügt. Der DSplitcontainer ist von dem Windows.Forms.Splitcontainer abgeleitet. Im Ganzen betrachtet habe ich eine Komponente, in der verschachtelt durch DSplitcontainer mehrere Komponenten der DContainer-Klasse liegen.
Das sieht dann so aus:


|------------------------------------------------------------------------------------|
|   DMainControl1                                                                    |
|  |------------------------------------------------+-------------------------|      |
|  |          DSplitContainer1                      ~                         |      |
|  |      |------------------+------------------|   ~    |------------------| |      |
|  |      |DSplitContainer2  ~                  |   ~    |   DContainer3    | |      |
|  |      |  |-------------| ~ |-------------|  |   ~    |                  | |      |
|  |      |  | DContainer1 | ~ | DContainer2 |  |   ~    |                  | |      |
|  |      |  |             | ~ |             |  |   ~    |                  | |      |
|  |      |  |             | ~ |             |  |   ~    |                  | |      |
|  |      |  |             | ~ |             |  |   ~    |                  | |      |
|  |      |  |             | ~ |             |  |   ~    |                  | |      |
|  |      |  |             | ~ |             |  |   ~    |                  | |      |
|  |      |  |             | ~ |             |  |   ~    |                  | |      |
|  |      |  |             | ~ |             |  |   ~    |                  | |      |
|  |      |  |-------------| ~ |-------------|  |   ~    |                  | |      |
|  |      |                  ~                  |   ~    |                  | |      |
|  |      |-----------Panel1-+-Panel2-----------|   ~    |------------------| |      |
|  |-----------------------------------------Panel1-+-Panel2------------------|      |
|                                                                                    |
|------------------------------------------------------------------------------------|

Nun wird z.B. der DContainer1 per Designer und der Entfernen-Taste gelöscht. Sobald dies geschieht, wird der DSplitcontainer2 per Code ebenfalls gelöscht, und der DContainer2 an die ehemalige Position des DSpllitcontainer2 verschoben.
Danach hat der oben angesprochene Fokus im Designer entweder garnichts oder eine Nichtinstanz des Typs Windows.Forms.Splitcontainer im Visier. Mit Nichtinstanz meine ich hier, dass in der Eigenschaftsseite kein Name angegeben ist, und die "fokussierte" Komponente auch nicht in der Form1.Designer.cs-Datei auftaucht.
Jedenfalls stürzt dann immer die gesamte IDE (VS 2005 EE) ab, wenn ich dann auf die Form direkt oder auf die weiße Fläche neben der Form1 klicke. Wenn ich aber z.B. auf den DContainer3 klicke, ist alles in Ordnung, und der Fokus wechselt ordnungsgemäß.

Vielleicht hilft das ja weiter, wenn es keine Möglichkeit gibt, Fokus per Code zu ändern.

13.12.2006 - 19:55 Uhr

Du hast schon recht, ich hab vorhin schonmal einen Thread gelesen, in dem es um sowas ähnliches ging (find grad die Seite nicht)

Ich habs jetzt hinbekommen, indem ich eine Schnittstelle definiert habe.
Jedes mal, wenn dann eine Funktion in dem obersten Control (Aufruf geht über parent, da parent nur im Konstruktor nicht funktioniert) aufgerufen wird, hangelt sich das "oberste Control" rekursiv durch alle Unterelemente und sucht nach der Schnittstelle.

13.12.2006 - 18:51 Uhr

Ich hab folgenden Code in einem UserControl, das jetzt erstmal das oberste in einer
Hirarchie darstellt

        public delegate void NewMiddle_Handler(object sender, EventArgs e);
        public event NewMiddle_Handler NewMiddle;

        public void OnNewMiddle()
        {
            NewMiddle(this, EventArgs.Empty);
        }

Dieses Element wird von einem seiner Childs aufgerufen. Alle anderen Childs sollen das Element abboniert haben, um darauf reagieren zu können
Dazu müssen sie aber erstmal an ihren Container (das Control, das ich oben als oberstes in der Hirarchie bezeichnet habe) rankommen.

Wenn ich im Konstruktor mal sowas schrebe

            DMainControl Main = this.ContainingDMainControl; // benutzt this.parent
            if (Main != null)
                Main.NewMiddle += new DMainControl.NewMiddle_Handler(ContainingDMainControl_NewMiddle);

gehts natürlich nicht, weil da das Parent noch nicht zugewiesen wurde.

Deshalb hab ich einen Eventhandler für das Event ParentChanged in den Childelementen gesetzt. Aber das Event wird nicht aufgerufen, wenn sich die Parent-eigenschaft von null auf die richtige ändert.

Gibts eine andere Möglichkeit, das Event NewMiddle in einem Child zu registrieren oder gibts vielleicht einen ganz anderen Ansatz?

Grüße, Phaiax

23.06.2006 - 22:40 Uhr

Ich habe mein Problem gelöst.

Mir ist zwar nicht klar, warum eine Klasse/Funktion einen Unterschied zwischen einer public-Variable und einer public-Eigenschaft macht, aber dass, was ich jetzt habe funktioniert.

Vielen Dank an herbivore

23.06.2006 - 21:29 Uhr

Ich verstehe in folgendem Text das Fettgedruchte nicht:

Als Beispiel soll das Steuerelement SplitContainer dienen: Es weist zwei Bereiche auf, Panel1 und Panel2. Diese Bereiche werden über die schreibgeschützte Panel1-Eigenschaft und die schreibgeschützte Panel2-Eigenschaft auf dem SplitContainer-Steuerelement verfügbar gemacht. Der Designer des SplitContainer-Steuerelements ruft für jeden Bereich EnableDesignMode auf, wodurch andere Komponenten darin abgelegt werden können. Damit der Inhalt von Panel1 und Panel2 gespeichert wird, muss das SplitContainer-Steuerelement selbst die Bereiche als öffentliche Eigenschaften verfügbar machen.

Quelle: http://msdn2.microsoft.com/de-de/library/system.windows.forms.design.controldesigner.enabledesignmode.aspx

Kann man schreibgeschützte Eigenschaften nachträglich als öffentlich deklarieren? (mit öffentlich ist doch public gemeint, oder?)
Vielleicht verstehe ich das auch ganz falsch. Deshalb bitte ich um Aufklährung.

Kurz darunter steht:

Um dieses Feature zu unterstützen, muss die als Host fungierende Infrastruktur die INestedContainer-Klasse als einen Dienst über die Site verfügbar machen.

Was genau bedeutet denn "als einen Dienst über die Site verfügbar machen"? (Ich habe jetzt endlich verstanden, wofür eine Site bzw. ISite da ist.) Jedenfalls implementiert weder die SplitContainer Klasse noch eine in ihrer Vererbungshirarchie vorhandene Klasse nicht die INestedContainer-Klasse.

Vielen Dank im Vorraus und WM-Grüße, Phaiax