How to loop through FORM elements?

The following code will allow me to loop through FORM tags but not the elements in them.  I may have five forms on one page.  How do I loop through form elements in the forth FORM?

private SHDocVw.InternetExplorer IE_Inst = new SHDocVw.InternetExplorerClass();
....
mshtml.IHTMLDocument2 HTMLDocument =
      (mshtml.IHTMLDocument2) this.IE_Inst.Document;
                        mshtml.IHTMLElementCollection forms = HTMLDocument.forms;

      foreach (mshtml.HTMLFormElementClass el in forms)
      {
                              
      strType = el.outerHTML;
        }

Once I'm in a particular FORM, I want to find certain input fields and fill in values.

Thanks,
Brett
brettrAsked:
Who is Participating?
 
Bob LearnedCommented:
Actually, I believe that it is the only way, because it is not like XML/XPath where you can select nodes.

Bob
0
 
brettrAuthor Commented:
I'm currently getting around the problem by looping through all elements in the Doc:

    foreach (mshtml.IHTMLElement wbrElm in wbrAll)
    {
     // Assign the inner html values of the input to our variables
     //look for only INPUT types
     if(wbrElm.tagName.ToLower() == "input" && wbrElm.outerHTML.IndexOf("name", 1) > 0)
     {
      strName = wbrElm.getAttribute("name", 0).ToString();
      Debug.WriteLine(wbrElm.tagName.ToLower() + " -- " + wbrElm.outerHTML);
      // We are only interested in filling text boxes,
      // and only interested in a specific  one, i.e. "q"    

      if (strName != null && strName.ToLower() == userNameFormField)          // Set the "value" with the setAttribute method.
       wbrElm.setAttribute("value", userNameValue, 0);


      if (strName != null && strName.ToLower() == passwordFormField)          // Set the "value" with the setAttribute method.
       wbrElm.setAttribute("value", passwordValue, 0);
     }
    } //end for each

Not the best technique.

Brett
0
 
brettrAuthor Commented:
Well, while we're at, I can do this in VB:
this.IE_Inst.Document.Forms(formIndex).Submit();

where
IE_Inst = SHDocVw.InternetExplorer

How can I do it in C#?  There isn't a Forms part.
0
 
Bob LearnedCommented:
That, my friend, is a great question, and one in which I don't have an answer.  There appears to be a difference in the way that C# imports the COM library, versus VB.  I didn't know that there was the Forms object, and again I have learned something new.

Bob
0
 
brettrAuthor Commented:
Well, I've abandoned looping through forms and have decided to post to a specific form in the page by doing:

object noValue = System.Reflection.Missing.Value;
string oURL = "http://www.somewhere.com";
string cSeparator = "&";
string cPostData = "field1=value1" + cSeparator
+ "field2=value2";
object vHeaders = "Content-Type: application/x-www-form-urlencoded" + "\n" + "\r";
object vPost = ASCIIEncoding.ASCII.GetBytes(cPostData);
this.IE_Inst.Navigate(oURL, ref noValue, ref noValue, ref vPost, ref vHeaders);
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.