Laden...

metode focus() - Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

Erstellt von MoreThanWords vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.503 Views
M
MoreThanWords Themenstarter:in
32 Beiträge seit 2009
vor 15 Jahren
metode focus() - Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

Hallo Zusammen,

Ich bin zwar kein völliger Anfänger auf dem Gebiet Webentwicklung. Stoße aber des öfteren an Grenzen/Problem, wenn Controls (z.B. Textboxen) zur Programmlaufzeit generiert werden. Kennt jemand zufällig einen guten Artikel, in dem dieses Problem etwas beläuchtet wird? (ich hab zwar ein Buch über ASP.NET mit C# - aber da wird kein Wort daüber verloren).

Nun zu meinem eigentlichen Problem

Ich befinde mich in der Methode eines Grides ItemCreated() und möchte darin ein TextFeld erzeugen und den Fokus auf dieses Textfeld setzten - Das mit dem Erzeugen funktioniert soweit - das Textfeld wird in HTML angezeigt.

Wenn ich aber den Focus setze bekomme ich folgende Exception:
<Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt>

Der Code sieht stark vereinfacht so aus:


protected void c1wgdFragenkatalog_ItemCreated(object sender, C1ItemEventArgs e)
{...
txt = new TextBox();
txtSetFocus = txt;
txt.ID = clsConstFragenkatalog.CONTROL_TXT_QUESTION;
txt.focus();
...
e.Item.Cells[2].Controls.Add(txt);
...
}

best regards
MoreThanWords

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo MoreThanWords

Kennt jemand zufällig einen guten Artikel, in dem dieses Problem etwas beläuchtet wird? (ich hab zwar ein Buch über ASP.NET mit C# - aber da wird kein Wort daüber verloren).

Nein, sowas wirst du in fast keinem Buch über ASP.NET finden.
Aber schau mal hier:

Der Code sieht stark vereinfacht so aus:

Bitte poste beim nächsten Mal den Code 1:1.
Dein Problem kannst du aber alleine lösen:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

M
MoreThanWords Themenstarter:in
32 Beiträge seit 2009
vor 15 Jahren

Hallo Peter,

Du wirst verblüfft sein, aber die Prüfung des Objektes auf Null funktioniert nicht immer.

Versuch mal folgenden Code. Auf dem Formular befindet sicht ein Button und ein Placeholder.

Bei Variante 1 funktioniert alles reibungslos. Bei Variante 2 gibt es eine Exception trotz der Überprüfung auf Null.

Die Focus Metode ist wohl nur möglich wenn sich das Objekt auf der Oberfläche befindet.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DynObjekteFocus
{
    public partial class _Default : System.Web.UI.Page
    {
        private TextBox tbx = new TextBox();
        protected void Page_Load(object sender, EventArgs e)
        {
            
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            //Variante 1
            PlaceHolder1.Controls.Add(tbx);
            tbx.ID = "tbxTest";
            tbx.Text = "Inhalt";
            if (tbx != null)
                tbx.Focus();
            //Variante 2
            //PlaceHolder1.Controls.Add(tbx);
        }
    }
}

Da ich mich bei meinem Beispiel in den Metoden einer Fremden Componente (Component One) befinde. Weiß ich nicht wann diese die Objekte auf der Obefläche plaziert.

Gibt es einen Page Methode, wo ich mich ganz zum Schluss reinhängen kann?

Beste Grüße
MoreThanWords

B
114 Beiträge seit 2007
vor 15 Jahren

Also die Exception ist logisch, da die Methode Focus() auf die Page-Property des Controls zugreift. Die ist aber erst gesetzt wenn das Control in die Seite eingefügt wurde.
Den Zeitpunkt wann eine fremde Componente eingebunden wird weiß ich nicht.
Aber eigentlich sollte sie es zum Zeitpunkt der (Click-)Ereignisse.

M
MoreThanWords Themenstarter:in
32 Beiträge seit 2009
vor 15 Jahren

Ich glaube, dass ich die optimale Methode zum setzen des Focus gefunden habe.

Page_PreRender() --> Dies ist der Zeitpunkt nachdem alle Ereignisse ausgeführt wurde und bevor der HTML Code erzeugt wurde.

Zur Vollständigkeit nochmal der komplette Quelltext:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DynObjekteFocus
{
    public partial class _Default : System.Web.UI.Page
    {
        private TextBox tbx = null;

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            //Variante 1
            //PlaceHolder1.Controls.Add(tbx);
            tbx = new TextBox();
            tbx.ID = "tbxTest";
            tbx.Text = "Inhalt";            
            //Variante 2
            PlaceHolder1.Controls.Add(tbx);
        }

        protected void Page_PreRender(Object sender, EventArgs e)
        {
            if (tbx != null)
                tbx.Focus();
        }

    }

}

Best Regards
MoreThanWords