C#Web浏览器控件未正确更新

时间:2010-12-07 14:52:01

标签: c# javascript

我目前正在开发一款技术上与使用动态内容的html网页互动的应用。

我的问题是,当我尝试将数据附加到WBC时,内容未正确更新。

namespace CheckList
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        .... code removed ....

        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != null)
            {
                HtmlDocument doc = webBrowser1.Document;
                HtmlElement row = doc.CreateElement("tr");
                HtmlElement cell1 = doc.CreateElement("td");
                HtmlElement cell2 = doc.CreateElement("td");
                cell1.InnerHtml = "[X] " + textBox1.Text;
                cell2.SetAttribute("class", "solved_2");
                cell2.InnerHtml = "Unsolved";
                row.AppendChild(cell1);
                row.AppendChild(cell2);
                doc.GetElementsByTagName("table")[0].AppendChild(row);
                //doc.Write(doc.GetElementsByTagName("HTML")[0].OuterHtml);
                webBrowser1.Document.Body.InnerHtml = doc.Body.InnerHtml;
            }
        }
    }
}

目前发生的是,我点击“添加”它应该将html添加到页面并更新和javascript以及还应该加载的内容。

它会添加内容,但在我尝试重新加载内容后,javascript无效。虽然CSS仍保持机智,但在此之后javascript无效。

JS来源:

var showalert = true;
var file = "file:///C:/Users/Removed/Documents/Visual Studio 2010/Projects/CheckList/CheckList/bin/Release/";
initiate_instance();

function initiate_instance() {
 //insert
 $.get(file + "saved.html", function(data) {
  //$("table#items").append("<tr><th width='70%'>Issue</th><th width='30%' class='right'>Solved</th></tr>");
  $("table#items").html($("table#items").html() + data);
 });

 //change [X] into a link
 $("table#items tr td").each(function() {
  $(this).html($(this).html().replace("[X]", "<a onclick='return remove(this)' href='#'>[X]</a>"));
 });

 //change the css
 $("table#items tr:odd").attr("class", "odd");
 $("table#items tr td:eq(0)").attr("width", "70%");
 $("table#items tr td:eq(1)").attr("width", "30%");
 $("td.solved, td.solved_2").click(function() {
  if($(this).attr("class") == "solved") {
   $(this).attr("class", "solved_2");
   $(this).text("Unsolved");
  } else {
   $(this).attr("class", "solved");
   $(this).text("Solved");
  }

  if(showalert == true) {
   alert("Remember, for these changes to keep effect please save before closing the program.");
   showalert = false;
  }
 });
}

//delete rows
function remove(obj) {
 if(showalert == true) {
  alert("Remember, for these changes to keep effect please save before closing the program.");
  showalert = false;
 }
 $(obj).parent().parent().remove();
 return false;
}

1 个答案:

答案 0 :(得分:2)

TL; DR:您是否尝试将“AllowNavigation”设置为true?

如果您需要阻止导航,但仍需要更新页面,我发现工作方法需要:

  • 使用空HTML初始化WebBrowser控件的DocumentText属性以初始化内部对象(即:DocumentDomDocumentDocument.Body等)
  • 允许导航并在页面完成时撤消(如果需要)

代码:

namespace CheckList
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // Initialize all the document objects
            webBrowser1.DocumentText = @"<html></html>";
            // Add the Document Completed event handler to turn off navigation
            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            // Load default information via LoadHtml(string html);
            LoadHtml(@"<html><head></head><body>Text!<script type='text/javascript' language='javascript'>alert('Aha!');</script></body></html>");
        }

        private void LoadHtml(string html)
        {
            webBrowser1.AllowNavigation = true;

            // This will trigger a Document Completed event
            webBrowser1.DocumentText = html;
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // Prevent further navigation
            webBrowser1.AllowNavigation = false;

            // Clean-up the handler if no longer needed
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // Do your document building
            LoadHtml(doc.Body.Parent.OuterHtml);
        }
    }
}

我发现这样做:

  • 阻止用户导航直到允许
  • 允许执行JavaScript(在OnDocumentCompleted触发之前)