Randy Cleary
Randy Cleary

Reputation: 725

C#: How do I get the document title from a WebBrowser element?

I'm having issues trying to get the document title from a WebBrowser in C#. It works fine in VB.NET, but it won't give me any properties in C#.

When I type in MyBrowser.Document., the only options I get are 4 methods: Equals, GetHashCode, GetType, and ToString - no properties.

I think it's because I have to assign the document to a new instance first, but I can't find the HTMLDocument class that exists in VB.NET.

Basically what I'm wanting to do is return the Document.Title each time the WebBrowser loads/reloads a page.

Can someone help please? It will be much appreciated!

Here is the code I have at the moment...

private void Link_Click(object sender, RoutedEventArgs e)
{
    WebBrowser tempBrowser = new WebBrowser();
    tempBrowser.HorizontalAlignment = HorizontalAlignment.Left;
    tempBrowser.Margin = new Thickness(-4, -4, -4, -4);
    tempBrowser.Name = "MyBrowser";
    tempBrowser.VerticalAlignment = VerticalAlignment.Top;
    tempBrowser.LoadCompleted += new System.Windows.Navigation.LoadCompletedEventHandler(tempBrowser_LoadCompleted);

    tempTab.Content = tempBrowser; // this is just a TabControl that contains the WebBrowser

    Uri tempURI = new Uri("http://www.google.com");
    tempBrowser.Navigate(tempURI);
}

private void tempBrowser_LoadCompleted(object sender, EventArgs e)
{
    if (sender is WebBrowser)
    {
        MessageBox.Show("Test");
        currentBrowser = (WebBrowser)sender;
        System.Windows.Forms.HtmlDocument tempDoc = (System.Windows.Forms.HtmlDocument)currentBrowser.Document;
        MessageBox.Show(tempDoc.Title);
    }
}

This code doesn't give me any errors, but I never see the second MessageBox. I do see the first one though (the "Test" message), so the program is getting to that code block.

Upvotes: 5

Views: 9198

Answers (5)

Godvicien
Godvicien

Reputation: 379

Finally works well with:

using System.Windows.Forms;

...

WebBrowser CtrlWebBrowser = new WebBrowser();

...

CtrlWebBrowser.Document.Title = "Hello World";
MessageBox.Show( CtrlWebBrowser.Document.Title );

Upvotes: 0

boknivet
boknivet

Reputation: 1

LoadCompleted doesn't fire. You should use Navigated event handler instead of it.

webBrowser.Navigated += new NavigatedEventHandler(WebBrowser_Navigated);

(...)

private void WebBrowser_Navigated(object sender, NavigationEventArgs e)
{
        HTMLDocument doc = ((WebBrowser)sender).Document as HTMLDocument;

        foreach (IHTMLElement elem in doc.all)
        {
            (...)
        }
        // you may have to dispose WebBrowser object on exit
}

Upvotes: 0

sturmstrike
sturmstrike

Reputation: 647

Add reference to Microsoft.mshtml

Add event receiver for LoadCompleted

webbrowser.LoadCompleted += new LoadCompletedEventHandler(webbrowser_LoadCompleted);

Then you will have no problems with document not being loaded in order to read values back out

    void webbrowser_LoadCompleted(object sender, NavigationEventArgs e)
    {
        // Get the document title and display it
        if (webbrowser.Document != null)
        {
            mshtml.IHTMLDocument2 doc = webbrowser.Document as mshtml.IHTMLDocument2;
            Informative.Text = doc.title;
        }
    }

Upvotes: 4

Hans Passant
Hans Passant

Reputation: 941307

You are not using the Windows Forms WebBrowser control. I think you got the COM wrapper for ieframe.dll, its name is AxWebBrowser. Verify that by opening the References node in the Solution Explorer window. If you see AxSHDocVw then you got the wrong control. It is pretty unfriendly, it just gives you an opaque interface pointer for the Document property. You'll indeed only get the default object class members.

Look in the toolbox. Pick WebBrowser instead of "Microsoft Web Browser".

Upvotes: 2

Conrad Frix
Conrad Frix

Reputation: 52645

string title = ((HTMLDocument)MyBrowser.Document).Title

Or

HTMLDocument Doc =  (HTMLDocument)MyBrowser.Document.Title ;
string title = doc.Title;

Upvotes: 0

Related Questions