none
Forms Designer greift in UserControl ein RRS feed

  • Frage

  • Es geht wieder um den UserControl aus meinem letzten Thread. Das Control monitorBrowser soll mir lokal generierten HTML-Text anzeigen. Dafür habe ich die Variabele MonitorHtml definiert.

    public partial class InetMonitorCtrl : UserControl
    {
        public String MonitorHtml
        {
            get
            {
                return monitorBrowser.DocumentText;
            }
            set
            {
                monitorBrowser.DocumentText = value;
            }
        }
        .
        .
        .
    }

    Wann immer ich etwas an dem UserControl mit dem Designer ändere, steht hinterher im generierten .cs für die Hauptform:

    // 
    // inetMonitorCtrl
    // 
    .
    this.inetMonitorCtrl.MonitorHtml = "<HTML></HTML>\0";
    this.inetMonitorCtrl.MonitorMode = true;
    .

    Wenn ich dann den HTML-Text selbst initialisieren will:

    private void InetMonitorCtrl_Load(object sender, EventArgs e)
    {
        this.MonitorHtml = Properties.Resources.htmlMonitor;
    }
    

    wird das einfach ignoriert. Die set Funktion wird zwar mit meinem Default Text aufgerufen, aber in monitorBrowser.DocumentText steht nach wie vor "<HTML></HTML>\0". Ich bin schrittweise mit dem Debugger durch gegangen. Wenn ich manuell die Designer Initialisierung lösche, wird der richtige Text angezeigt.

    Wie kann ich dem Designer verbieten, meine Variabelen anzufassen, bzw. was hat der da überhaupt dran rum zu manipulieren? Für meine Variabele MonitorMode gilt überigens dasselbe, nur da ist es nicht so offensichtlich.

    TIA, Hajü

    Sonntag, 18. November 2012 13:15

Antworten

  • Hallo Hajü,

    der Designer serialisiert alle öffentlichen Eigenschaften, wenn man es ihm nicht verbietet.
    Und hier findet er den DocumentText des monitorBrowser vor, was er "verewigt" - und liefert wohl im Zweifelsfall ein leeres Html-Dokument.

    Abhilfe: Setze das DesignerSerializationVisibilityAttribute für die Eigenschaft auf false. Dann wird die Eigenschaft ignoriert. Zudem sollte man auch Browsable(false) setzen, damit die Eigenschaft nicht im Designer auftaucht.

    Anstatt des Load-Ereignisses wäre das Setzen von statischen Ressourcen besser im Konstruktor nach InitializeComponent aufgehoben (siehe Hinweis zum Ereignis).

    Gruß Elmar

    • Als Antwort markiert Hans-J. Ude Montag, 19. November 2012 10:06
    Sonntag, 18. November 2012 20:22
    Beantworter

Alle Antworten

  • Hallo Hajü,

    der Designer serialisiert alle öffentlichen Eigenschaften, wenn man es ihm nicht verbietet.
    Und hier findet er den DocumentText des monitorBrowser vor, was er "verewigt" - und liefert wohl im Zweifelsfall ein leeres Html-Dokument.

    Abhilfe: Setze das DesignerSerializationVisibilityAttribute für die Eigenschaft auf false. Dann wird die Eigenschaft ignoriert. Zudem sollte man auch Browsable(false) setzen, damit die Eigenschaft nicht im Designer auftaucht.

    Anstatt des Load-Ereignisses wäre das Setzen von statischen Ressourcen besser im Konstruktor nach InitializeComponent aufgehoben (siehe Hinweis zum Ereignis).

    Gruß Elmar

    • Als Antwort markiert Hans-J. Ude Montag, 19. November 2012 10:06
    Sonntag, 18. November 2012 20:22
    Beantworter
  • Aha, "DesignerSerializationVisibilityAttribute" war also das fehlende
    Zauberwort. Irgendwie habe ich in letzter Zeit immer Probleme mit
    Codegeneratoren ;)
     
    Ich hatte die Initialisierung auch zuerst im Konstruktor, dann habe ich
    sie bewusst weiter nach hinten gestellt. Um sicher zu seien, dass ich
    gegenüber dem Designer auch das letzte Wort habe. Warum mein Text
    trotzdem nicht übernommen wurde bleibt mir ein Rätsel. Vielleicht hat es
    was mit der Message-Pumpe oder sowas zu tun, aber das ist nur so ins
    Blaue geraten.
     
    Hajü
     
    Montag, 19. November 2012 09:55