2010-02-28 5 views
13

Sto tentando di automatizzare in un WinForm utilizzando un controllo WebBrowser per navigare e recuperare le informazioni del report da un sito Web. È possibile inserire valori nelle caselle di testo e richiamare gli eventi di clic per pulsanti e collegamenti, ma non ho capito come selezionare un'opzione a discesa .... in modo automatico. Qualcuno consiglia come selezionare una voce da un menu a discesa, dato questo esempio HTML:Controllo WebBrowser HTMLDocument automatizza la selezione dell'elenco a discesa delle opzioni

<SELECT id="term_id" size="1" name="p_term_in"><option value="">Select Another Term<option value="201050">Summer 2010<option value="201010">Spring 2010<option value="200980">Fall 2009</SELECT> 

Per gli altri che possono imparare l'immissione di valori per le caselle di testo e invocando eventi click ecco come si fa:

webBrowser1.Document.GetElementById("<HTML ELEMENT NAME>").SetAttribute("value", "THE NAME"); 

pulsante o un collegamento Invoke clic:

webBrowser1.Document.GetElementById("<BUTTON>").InvokeMember("click"); 

valori Così ho risolto entrano ed invocando click, ma non ho risolto selezionando un valore di discesa.

risposta

16

Supponendo di aver il seguente selezionare nel codice HTML:

<select id="term_id" size="1" name="p_term_in"> 
    <option value="">Select Another Term 
    <option value="201050">Summer 2010 
    <option value="201010">Spring 2010 
    <option value="200980">Fall 2009 
</select> 

Questo dovrebbe consentire di preselezionare il terzo valore:

webBrowser1.Document.GetElementById("term_id").SetAttribute("value", "201010"); 
+4

Spiacente , questo non funziona in quanto l'elemento 'select' non ha un attributo' value'.Appena testato ... – AxelEckenberger

5

È necessario selezionare l'attributo selected sull'opzione desiderata.

Dato:

<select id="mySelect"> 
    <option>1</option> 
    <option>2</option> 
    <option>3</option> 
</select> 

Di seguito avrebbe selct la terza opzione:

webBrowser1.Document 
      .GetElementById("") 
      .Children.GetElementsByName("option")[2] 
      .SetAttribute("selected", "selected"); 
4

provare questo:

Aggiungi riferimento per Microsoft.mshtml in progetto -> aggiungere il riferimento ...

Dim cboTemp As mshtml.HTMLSelectElement 
    cboTemp = WebBrowser1.Document.GetElementById("myselect").DomElement 
    cbotemp.selectedindex = 2 

avere l'cbotemp variabile impostato su un elemento di selezione ti dà maggiore accesso al controllo :)

3
HtmlElement hField = webBrowser1.Document.GetElementById("ID"); 
hField.SetAttribute("selectedIndex", "2"); 

selezionare da indice (base zero) non il valore ....

6
var select = webBrowser.Document.GetElementById("ddlProyectos"); 

mshtml.HTMLSelectElement cbProyectos = select.DomElement as mshtml.HTMLSelectElement; 

var total = cbProyectos.length; 
for (var i= 0; i < total; i++) 
{ 
    cbProyectos.selectedIndex = i; 
    if (cbProyectos.value.Contains("13963")) 
    { 
     break; 
    } 

} 
//cbProyectos.selectedIndex = 4; 
select.InvokeMember("onchange"); 

select.Children[4].SetAttribute("selected", "selected"); 

var theElementCollection = webBrowser.Document.GetElementsByTagName("select"); 
foreach (HtmlElement el in theElementCollection) 
{ 
    if (el.GetAttribute("value").Equals("13963")) 
    { 
     el.SetAttribute("selected", "selected"); 
     //el.InvokeMember("click"); 
    } 
} 
+0

Il tuo suggerimento funziona in quanto l'opzione viene selezionata correttamente (posso vederla selezionata). Tuttavia, lo script associato all'opzione non sembra essere eseguito. Quando ho selezionato manualmente questa opzione in seguito, lo script funziona correttamente. Hai qualche idea del perché? Come sistemarlo? – newman

2

È possibile utilizzare questo:

webBrowser1.Document.GetElementById("term_id").SetAttribute("value",yourText); 
3

sto rispondendo su questo post, dopo cinque anni, per le persone che sono alla ricerca di una soluzione di questo problema.

Se avete solo bisogno di presentare/inviare un valore per la discesa, allora questa linea è sufficiente:

webBrowser1.Document.GetElementById("term_id").SetAttribute("value", "200980"); 

Ma se si ha realmente bisogno per selezionare un'opzione di fondo, quindi:

HtmlElement selectDom = webBrowser1.Document.GetElementById("term_id"); 
foreach (HtmlElement option in selectDom.GetElementsByTagName("option")) 
{ 
    if (option.GetAttribute("value") == "200980") 
    { 
     var dom = option.DomElement as dynamic; 
     dom.selected = true; 
     // selectDom.InvokeMember("onChange"); // if you need this too 
     break; 
    } 
} 
Problemi correlati