Object reference not set to an instance of an object.   otázka

C#

Zdravím vás,

nejsem programátor, pouze se snažím trochu zjednodušit vyplňování formulářů v práci.

Následující kód nefunguje, může mi někdo prosím poradit?

Hlásí to chybu: Object reference not set to an instance of an object.

Předem díky.


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            webBrowser1.Navigate("https://....");
        }

        
        private void button1_Click(object sender, EventArgs e)
        {
        SendData1();
        }
        private void button2_Click(object sender, EventArgs e)
        {
        SendData2();
        }

        private void SendData1()
        {
            textBox1.Text = "..";
            textBox2.Text = "..";
            webBrowser1.Document.GetElementById("loginname").SetAttribute("value", textBox1.Text);
            webBrowser1.Document.GetElementById("password").SetAttribute("value", textBox2.Text);           
            webBrowser1.Document.GetElementById("login").InvokeMember("click");

         
            
        }
        private void SendData2()
        {
        webBrowser1.Document.GetElementById("Q33024").InvokeMember("click");
        }

    }
}

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co se týká syntaxe, chybu nevidím. Na kterou část kódu chybové hlášení ukazuje?

(účelností kódu se nezabývám)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Spustťe program priamo z Visual Studia, resp. Visual C# Express Edition, a keď uvidíte vo VS, že zachytilo tzv. výnimku(angl. Exception), stlačte na klávesnici kláves PrintScreen(niekedy býva označený PrtSc, alebo podobne). Následne otvorte nejaký grafický editor, napríklad Skicár, podržte kláves Ctrl, stlačte kláves V, potom môžete kláves Ctrl pustiť. Ukáže sa Vám kópia toho, čo ste videli vo VS, obrázok uložte, "hoďte" niekam na internet, napr. http://www.uloz.to/ a dajte sem URL k obrázku. Tak budeme vedieť povedať viac ohľadom tej chyby.

Ohľadom tej chyby: Premenná, ktorú deklarujete pomocou Dim, obsahuje len adresu, na ktorej sa nachádza skutočný objekt, a v počiatočnom stave obsahuje 0, tzn. žiaden objekt. Adresu k objektu do nej priradíte pomocou New. A práve toto ste niekde zabudli. Alebo ste siahli na premennú príliš skoro.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Prvním tlačítkem aplikace otevře webovou přihlašovací stránku a přihlásí se jako uživatel, ve stejném okně prohlížeče se po přihlášení načte nová stránka. Další tlačítko slouží k aktivaci vybraného odkazu na této nové stránce.

Program lze spustit, ale po stlačení druhého tlačítka se neprovede žádná akce, ale debbuger ohlásí chybu. Můžete prosím napsat jak použít příkaz new ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Existujú hodnotové a referenčné typy. Premenná hodnotového typu obsahuje dáta objektu. Môžete zavolať konštruktor(pomocou New), ale nie je to nutné.

Premenná referenčného typu obsahuje len adresu, na ktorej sa nachádzajú dáta objektu. Môže taktiež obsahovať hodnotu Nothing, to je jej počiatočný stav. Vtedy premenná neukazuje na žiaden objekt, a preto nemôžete siahať na jej členy. Adresu na objekt priradíte buď tým, že priradíte inú premennú kompatibilného datového typu, alebo cez New. V prvom prípade budú obe premenné ukazovať na ten istý objekt, keď použijete New, vytvorí sa nový objekt, a adresa naň sa priradí do premennej.

REM Deklarácia premennej referenčného typu:
Dim a As System.Windows.Forms.Form
REM Priradenie hodnoty
a = New System.Windows.Forms.Form() REM Do zátvoriek parametre pre konštruktor
REM Naraz
Dim a As New System.Windows.Forms.Form() REM Do zátvoriek parametre pre konštruktor
REM Skopírovanie adresy
Dim b As System.Windows.Forms.Form REM potrebujeme ešte jednu premennú
b = a REM Takto skopírujete adresu, takže premenné "a" a "b" budú odkazovať na TEN ISTÝ objekt

REM Definícia konštruktora:
Public Class Demo REM Musíte byť vnútri triedy(Class)
  Public Sub New() REM Tu uveďte parametre konštruktora, ktoré predáte pri tvorbe objektu cez New
  End Sub
End Class

Už Vám to je jasné?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přiznám se, že mi uniká souvislost s mou aplikací.. můžete mi tedy poradit co je třeba konkrétně změnit, aby se provedla potřebná akce na nové stránce ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Najprv spravte, čo som Vám povedal predtým, v mojom prvom príspevku ,dnes o 14:16, potom, keď uvidím tú chybu na obrázku, tak Vám budem vedieť poradiť viac. V podstate ale siahate na premennú, ktorá obsahuje hodnotu Nothing.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

je to zde:

http://ulozto.cz/xVQdLyt/hello-world-web...

MessageBox je tam provizorne, aby mela stranka cas se nacist..

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pravdepodobne to bude tým, že v dokumente neexistuje objekt s ID Q33024. Skúsil by som ten jeden riadok nahradiť týmto kódom:

System.Diagnostics.Debug.Print("HtmlElements:");
var temp = webBrowser1.Document.All;
foreach(var item in temp)
  System.Diagnostics.Debug.Print("Element id: {0} name: {1} tagname: {2} ",item.Id, item.Name, item.TagName);
System.Diagnostics.Debug.Print("End of the element list.");

Ešte pred kompiláciou otvorte okno Tools->Customize, prepnite sa na záložku Commands, v prvom ComboBoxe vyberte View, potom kliknite na AddCommand..., vľavo vyberte View, vpravo vyberte Output, potom OK, a Close. Ak to nebudete vedieť spraviť, skúste podľa týchto obrázkov:

http://uloz.to/x2mDLg2/screenshots-zip

Teraz preložte a spusťte Váš program. Vo VS otvorte okno Output: View-> Output. Spravte to, čo predtým vyvolalo výnimku, aby sa spustil ten kód, čo som napísal vyššie. V okne Output by sa mal objaviť zoznam elementov, ktoré obsahuje otvorený dokument. Skontrolujte, či je medzi nimi element Q33024 . Ak nie, tak to je dôvod, prečo Vám program padá.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Inak, našiel som lepší spôsob, ako skontrolovať, či je dokument načítaný.


//Teraz otvorte dokument
//Následujúci kód počká, kým bude úplne načítaný
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                System.Threading.Thread.Sleep(200);

//Dokument je načítaný, môžete siahať na Html elementy
nahlásit spamnahlásit spam 0 odpovědětodpovědět

tak to skutečně bylo špatně opsané ID. Nyní se odkaz otevře, ale v novém okně a stránka požaduje opět login, budu to asi muset řešit přes, request. Díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

nicméně, zkoušel jsem ten kod a nelze zkompilovat:

'object' does not contain a definition for 'Id' and no extension method 'Id' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

..totéž pro Name, .TagName

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ktorú verziu jazyka C# používate? Skúste ešte toto:

System.Diagnostics.Debug.Print("HtmlElements:");
HtmlElementCollection temp = webBrowser1.Document.All;
foreach(HtmlElement item in temp)
  System.Diagnostics.Debug.Print("Element id: {0} name: {1} tagname: {2} ",item.Id, item.Name, item.TagName);
System.Diagnostics.Debug.Print("End of the element list.");
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Používám Visual C# 2010 Express, tento kod již funguje, děkuji, velmi zajímavý nástroj.

Přestože jsem nakonec zaměřil správné tlačítko, stránka v novém okně se stejně nenačte - je vyžadován znovu login. Je možné že to je nastavením cookies ve webbrowser?. Pokud odkaz otevřu ručně ve Firefoxu, není problém. Fiddler ukazuje jiná cookies v request pro webbrowser a pro Firefox.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback