Avatar billede fynbo Nybegynder
03. november 2004 - 09:34 Der er 15 kommentarer og
1 løsning

dom & html

Hej,

Hvordan laver jeg en løkke som kører en <select ..> boks igennem på en hjemmeside og vælger en bestemt værdi.

Hjemmesiden hentes via et browserobjekt.

Bruger følgende kode til at gennemgå alle INPUT felter:

IHTMLDocument2 htmlDoc = (m_AxWebBrowser.Document) as IHTMLDocument2;
IHTMLElementCollection elements = htmlDoc.all;
foreach(IHTMLElement element in elements)
{
  if(element.tagName == "INPUT")
  {
    object objAttrValue = "text i textBox";
    element.setAttribute("Value", objAttrValue, 0);
  }
}

Se evt dette spørgsmål: http://www.eksperten.dk/spm/555793
Avatar billede sovsekoder Nybegynder
03. november 2004 - 10:22 #1
0) givet følgende html-dokument:
<html>
<body>
    <SELECT ID=demo VALUE="Enter a value">
        <option id=demo1>1</option>
        <option id=demo2>2</option>
        <option id=demo3>3</option>
        <option id=demo4 selected    >4</option>
    </select>
</body>
</html>

1) så skal man huske at abonere på complete document event'et (på sin axWebBrowser):

        private void axWebBrowser1_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
        {
            IHTMLDocument2 doc = axWebBrowser1.Document as IHTMLDocument2;
            string str = doc.readyState;
            if(str == "complete")
            {
                MessageBox.Show("done");
            }
        }

2) dokumentet bør først tages i brug efter messagebox'en har været op, hvor der står "done!", følgende kode vælger option 4 i comboboxen:
        private void button1_Click(object sender, System.EventArgs e)
        {
            IHTMLDocument3 doc = axWebBrowser1.Document as IHTMLDocument3;
            IHTMLElement element = doc.getElementById("demo3");
            element.setAttribute("selected", (object)true, 0);
        }
Avatar billede sovsekoder Nybegynder
03. november 2004 - 10:22 #2
ja ok, den vælger så "3" i comboboxen - jeg fik skrevet forkert
Avatar billede sovsekoder Nybegynder
03. november 2004 - 10:24 #3
det der er ideen i ovenstående kode er, at give sine elementer et ID - på denne måde bliver det nemmere at hente elementer og manipulere dem:

elementet hentes ved at kalde:
IHTMLDocument3 doc = axWebBrowser1.Document as IHTMLDocument3;
IHTMLElement element = doc.getElementById( <<<<<ID HERE>>>>>);
hvor <<<<<ID HERE>>>>> er en streng der indeholder ID'et på elementet, f.eks demo3.

elementets attributter sættes ved at bruge metoden setAttribute:
element.setAttribute("selected", (object)true, 0);
Avatar billede fynbo Nybegynder
03. november 2004 - 10:25 #4
Hej igen!

Den skal vælge ud fra en value:
<html>
<body>
    <SELECT ID=demo VALUE="Enter a value">
        <option value="demo1">1</option>
        <option value="demo2">2</option>
        <option value="demo3">3</option>
        <option value="demo4" selected>4</option>
    </select>
</body>
</html>
Avatar billede fynbo Nybegynder
03. november 2004 - 10:25 #5
Jeg har ikke mulighed for at give dem idé, desværre..
Avatar billede fynbo Nybegynder
03. november 2004 - 10:25 #6
flot stavet.. har ikke mulighed for at give dem ID :P
Avatar billede sovsekoder Nybegynder
03. november 2004 - 10:27 #7
har <select> elementet en ID (som du i eksemplet har sat til demo) ?
Avatar billede sovsekoder Nybegynder
03. november 2004 - 10:39 #8
så noget i denne stil:
private void button1_Click(object sender, System.EventArgs e)
        {
            SelectCombo("demo", "demo3");
        }

        void SelectCombo(string id, string optionValue)
        {
            IHTMLDocument2 htmlDoc = (axWebBrowser1.Document) as IHTMLDocument2;
            IHTMLElementCollection elements = htmlDoc.all;
            foreach(IHTMLElement element in elements)
            {
                if(string.Compare(element.id, id, true)!=0) continue;
                if(string.Compare(element.tagName, "SELECT", true)==0)
                {
                    IHTMLElementCollection children = element.children as IHTMLElementCollection;
                    foreach(IHTMLElement child in children)
                    {
                        string attr = (string)child.getAttribute("Value", 0);
                        if(attr == null) continue;
                        if(string.Compare(attr,optionValue,true)==0)
                        {
                            child.setAttribute("Selected", (object)true, 0);
                        }
                    }
                }
            }
        }
Avatar billede sovsekoder Nybegynder
03. november 2004 - 10:41 #9
hvor man:
løber gennem alle elementer, hvis man møder et elemet med det rigtige id(select elementet), kigger man i dens children (alle under elementer).

disse underelementer tjekkes for om deres value er "demo3" eller hvad man nu har givet metoden i optionValue. Og så vælges den på gældende option (der brude jo egentlig være et break; efter child.setAttribute - da man er færdig med søgningen her)
Avatar billede fynbo Nybegynder
03. november 2004 - 10:44 #10
select har ikke noget id, men der er til gengæld kun éen select på siden, så der er ikke så meget tvivl om hvilken select box, den skal løbe igennem..
Avatar billede sovsekoder Nybegynder
03. november 2004 - 10:47 #11
ok :) så kan du bare fjerne linien:
if(string.Compare(element.id, id, true)!=0) continue;


og fjerne (string id) argumentet i metoden
Avatar billede sovsekoder Nybegynder
03. november 2004 - 10:48 #12
så den færdige "selectCombo" metode vil se således ud:
void SelectCombo(string id, string optionValue)
        {
            IHTMLDocument2 htmlDoc = (axWebBrowser1.Document) as IHTMLDocument2;
            IHTMLElementCollection elements = htmlDoc.all;
            foreach(IHTMLElement element in elements)
            {
                if(string.Compare(element.tagName, "SELECT", true)==0)
                {
                    IHTMLElementCollection children = element.children as IHTMLElementCollection;
                    foreach(IHTMLElement child in children)
                    {
                        string attr = (string)child.getAttribute("Value", 0);
                        if(attr == null) continue;
                        if(string.Compare(attr,optionValue,true)==0)
                        {
                            child.setAttribute("Selected", (object)true, 0);
                            break;
                        }
                    }
                }
            }
        }
Avatar billede sovsekoder Nybegynder
03. november 2004 - 10:49 #13
og når man så fjerne id argumentet bliver det til :
        void SelectCombo(string optionValue)
        {
            IHTMLDocument2 htmlDoc = (axWebBrowser1.Document) as IHTMLDocument2;
            IHTMLElementCollection elements = htmlDoc.all;
            foreach(IHTMLElement element in elements)
            {
                if(string.Compare(element.tagName, "SELECT", true)==0)
                {
                    IHTMLElementCollection children = element.children as IHTMLElementCollection;
                    foreach(IHTMLElement child in children)
                    {
                        string attr = (string)child.getAttribute("Value", 0);
                        if(attr == null) continue;
                        if(string.Compare(attr,optionValue,true)==0)
                        {
                            child.setAttribute("Selected", (object)true, 0);
                            break;
                        }
                    }
                }
            }
        }
Avatar billede sovsekoder Nybegynder
03. november 2004 - 10:50 #14
så hvis du kalder SelectCombo("demo2"); så burde den option der har value=demo2 blive valgt
Avatar billede fynbo Nybegynder
03. november 2004 - 11:52 #15
og et svar tak ;)

det fungerede upåklageligt
Avatar billede sovsekoder Nybegynder
03. november 2004 - 12:36 #16
super, og et svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester