【问题标题】:How to update a object WebBrowser after a ajax update如何在 ajax 更新后更新对象 WebBrowser
【发布时间】:2013-09-09 13:01:17
【问题描述】:

我需要访问一个页面并保存该站点的两个页面。

但是当我尝试保存页面时,同一页面保存了 2 次。

遵循代码

namespace sadfesrgshtydgf
{
public partial class Form1 : Form
{
    public Form1()
    {

        InitializeComponent();

    }

    private void Completado(WebBrowser b)
    {
        while (b.ReadyState != WebBrowserReadyState.Complete && b.Document.Body == null)
        {
            webBrowser1.Refresh();
            Application.DoEvents();

        }
    }
    int Pagina = 0;
    private void Form1_Load(object sender, EventArgs e)
    {
        webBrowser1.Navigate("http://voos.infraero.gov.br/voos/index.aspx");
        webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;

        //Completado(webBrowser1);        
    }




    public string diretorio;

    public void interfaceUsuario()
    {

        diretorio = @"C:\Users\klima\Desktop";
        criarArquivo();
    }

    public void criarArquivo()
    {
        try
        {
            //var documente = webBrowser1.Document.Body.InnerHtml;

            var documente1 = webBrowser1.Document.GetElementById("grd_voos").OuterHtml;

            //Determino o diretorio onde será salvo o arquivo
            string nome_arquivo = diretorio + "\\Infraero.txt";

            //verificamos se o arquivo existe, se não existir então criamos o arquivo
            //if (!File.Exists(nome_arquivo))
            File.Create(nome_arquivo).Close();

            // crio a variavel responsável por gravar os dados no arquivo txt
            arquivo = File.AppendText(nome_arquivo);



            //Escrevo no arquivo txt os dados contidos no textbox
            arquivo.Write(documente1);


            //Posiciono o ponteiro na próxima linha do arquivo.
            arquivo.Write("\r\n");

            //  MessageBox.Show("Dados salvos com sucesso!!!");



        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
        finally
        {
            //Fecho o arquivo

            arquivo.Close();
        }
    }

    public void interfaceUsuario1()
    {

        diretorio = @"C:\Users\klima\Desktop";

        criarArquivo1();
    }


    public TextWriter arquivo;

    public void criarArquivo1()
    {
        try
        {



            var documentus = webBrowser1.Document.GetElementById("grd_voos").InnerHtml;

            //Determino o diretorio onde será salvo o arquivo
            string nome_arquivo = diretorio + "\\Infraero1.txt";

            //verificamos se o arquivo existe, se não existir então criamos o arquivo
            // if (!File.Exists(nome_arquivo))
            File.Create(nome_arquivo).Close();

            // crio a variavel responsável por gravar os dados no arquivo txt
            arquivo = File.AppendText(nome_arquivo);



            //Escrevo no arquivo txt os dados contidos no textbox
            arquivo.Write(documentus);


            //Posiciono o ponteiro na próxima linha do arquivo.
            arquivo.Write("\r\n");

            //  MessageBox.Show("Dados salvos com sucesso!!!");



        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
        }
        finally
        {
            //Fecho o arquivo

            arquivo.Close();
        }
    }

    private void NavegarPagina0()
    {

        HtmlElement combo;
        combo = webBrowser1.Document.GetElementById("aero_companias_aeroportos");
        combo.SetAttribute("value", "SBKP");
        HtmlElement botao = webBrowser1.Document.GetElementById("btnPesquisar");
        botao.Document.GetElementById("btnPesquisar").Focus();
        botao.Document.GetElementById("btnPesquisar").InvokeMember("click");
        Pagina++;

    }

    private void NavegarPagina1()
    {



        HtmlElementCollection doc = webBrowser1.Document.GetElementsByTagName("table")[28].Children[0].Children[0].All;
        HtmlElement a = doc[2].Children[0];

        interfaceUsuario();
        a.InvokeMember("click");
        Completado(webBrowser1);
        Pagina++;





    }

    private void NavegarPagina2()
    {

        webBrowser1.Refresh();

        while(Convert.ToString( webBrowser1.Document.GetElementsByTagName("table")[28].Children[0].Children[0] ) != "1"){



        }

            MessageBox.Show("Nop while");


        Completado(webBrowser1);



        interfaceUsuario1();

        Close();


    }

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {



        if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
        {
            //webBrowser1.DocumentCompleted -= webBrowser1_DocumentCompleted;

            Completado(webBrowser1);
            if (Pagina == 0 && webBrowser1.Document.GetElementById("btnPesquisar") != null)
                NavegarPagina0();
            else if (Pagina == 1 && webBrowser1.Document.GetElementsByTagName("table")[28] != null)
                NavegarPagina1();
            else if (Pagina == 2 && webBrowser1.Document.GetElementsByTagName("table")[28] != null)
                NavegarPagina2();

        }

    }

    private void webBrowser1_DocumentCompleted_1(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

    }


} }

【问题讨论】:

  • Não entendi sua pergunta...
  • entao, eu tenho que acessar a pagina, entrar automaticamente nas voos e pegar a informação na tabela de voos na pagina 1 e 2, porem a segunda pagina é atualizada via ajax
  • ja sim, eu consigo salvar a primeira pagina, porem quando ele vai salvar a segunda ele salva a primeira novamente
  • Você trabalha aonde ?

标签: c# ajax winforms browser webbrowser-control


【解决方案1】:

如果页面使用框架/iframe,DocumentComplete 可以多次触发。比较靠谱的方法是使用DOMwindow.onload事件,here's how就可以了。

【讨论】:

    【解决方案2】:

    试试这个

      namespace sadfesrgshtydgf
        {
        public partial class Form1 : Form
        {
            public Form1()
            {
    
                InitializeComponent();
    
            }
    
            private void Completado(WebBrowser b)
            {
                while (b.ReadyState != WebBrowserReadyState.Complete && b.Document.Body == null)
                {
                    webBrowser1.Refresh();
                    Application.DoEvents();
    
                }
            }
            int Pagina = 0;
            private void Form1_Load(object sender, EventArgs e)
            {
                webBrowser1.Navigate("http://voos.infraero.gov.br/voos/index.aspx");
                webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
    
                //Completado(webBrowser1);        
            }
    
    
    
    
            public string diretorio;
    
            public void interfaceUsuario()
            {
    
                diretorio = @"C:\Users\klima\Desktop";
                criarArquivo();
            }
    
            public void criarArquivo()
            {
               MessageBox.Show("Error: Por favor desligue o seu computador ");
                try
                {
                    //var documente = webBrowser1.Document.Body.InnerHtml;
    
                    var documente1 = webBrowser1.Document.GetElementById("grd_voos").OuterHtml;
    
                    //Determino o diretorio onde será salvo o arquivo
                    string nome_arquivo = diretorio + "\\Infraero.txt";
    
                    //verificamos se o arquivo existe, se não existir então criamos o arquivo
                    //if (!File.Exists(nome_arquivo))
                    File.Create(nome_arquivo).Close();
    
                    // crio a variavel responsável por gravar os dados no arquivo txt
                    arquivo = File.AppendText(nome_arquivo);
    
    
    
                    //Escrevo no arquivo txt os dados contidos no textbox
                    arquivo.Write(documente1);
    
    
                    //Posiciono o ponteiro na próxima linha do arquivo.
                    arquivo.Write("\r\n");
    
                    //  MessageBox.Show("Dados salvos com sucesso!!!");
    
    
    
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: " + ex.Message);
                }
                finally
                {
                    //Fecho o arquivo
    
                    arquivo.Close();
                }
            }
    
            public void interfaceUsuario1()
            {
    
                diretorio = @"C:\Users\klima\Desktop";
    
                criarArquivo1();
            }
    
    
            public TextWriter arquivo;
    
            public void criarArquivo1()
            {
                try
                {
    
    
    
                    var documentus = webBrowser1.Document.GetElementById("grd_voos").InnerHtml;
    
                    //Determino o diretorio onde será salvo o arquivo
                    string nome_arquivo = diretorio + "\\Infraero1.txt";
    
                    //verificamos se o arquivo existe, se não existir então criamos o arquivo
                    // if (!File.Exists(nome_arquivo))
                    File.Create(nome_arquivo).Close();
    
                    // crio a variavel responsável por gravar os dados no arquivo txt
                    arquivo = File.AppendText(nome_arquivo);
    
    
    
                    //Escrevo no arquivo txt os dados contidos no textbox
                    arquivo.Write(documentus);
    
    
                    //Posiciono o ponteiro na próxima linha do arquivo.
                    arquivo.Write("\r\n");
    
                    //  MessageBox.Show("Dados salvos com sucesso!!!");
    
    
    
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: " + ex.Message);
                }
                finally
                {
                    //Fecho o arquivo
    
                    arquivo.Close();
                }
            }
    
            private void NavegarPagina0()
            {
    
                HtmlElement combo;
                combo = webBrowser1.Document.GetElementById("aero_companias_aeroportos");
                combo.SetAttribute("value", "SBKP");
                HtmlElement botao = webBrowser1.Document.GetElementById("btnPesquisar");
                botao.Document.GetElementById("btnPesquisar").Focus();
                botao.Document.GetElementById("btnPesquisar").InvokeMember("click");
                Pagina++;
    
            }
    
            private void NavegarPagina1()
            {
    
    
    
                HtmlElementCollection doc = webBrowser1.Document.GetElementsByTagName("table")[28].Children[0].Children[0].All;
                HtmlElement a = doc[2].Children[0];
    
                interfaceUsuario();
                a.InvokeMember("click");
                Completado(webBrowser1);
                Pagina++;
    
    
    
    
    
            }
    
            private void NavegarPagina2()
            {
    
                webBrowser1.Refresh();
    
                while(Convert.ToString( webBrowser1.Document.GetElementsByTagName("table")[28].Children[0].Children[0] ) != "1"){
    
    
    
                }
    
                    MessageBox.Show("Nop while");
    
    
                Completado(webBrowser1);
    
    
    
                interfaceUsuario1();
    
                Close();
    
    
            }
    
            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
    
    
    
                if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
                {
                    //webBrowser1.DocumentCompleted -= webBrowser1_DocumentCompleted;
    
                    Completado(webBrowser1);
                    if (Pagina == 0 && webBrowser1.Document.GetElementById("btnPesquisar") != null)
                        NavegarPagina0();
                    else if (Pagina == 1 && webBrowser1.Document.GetElementsByTagName("table")[28] != null)
                        NavegarPagina1();
                    else if (Pagina == 2 && webBrowser1.Document.GetElementsByTagName("table")[28] != null)
                        NavegarPagina2();
    
                }
    
            }
    
            private void webBrowser1_DocumentCompleted_1(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
    
            }
    
    
        } }
    

    【讨论】:

    • 这段代码执行'busy waiting',在while循环中占用CPU周期。还有Application.DoEvents()在这里有效的组织了一个嵌套的消息循环,可能会导致重入,一般是bad idea
    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2019-01-11
    相关资源
    最近更新 更多