2010-12-07 3 views
0

Je travaille actuellement sur une application qui interagit techniquement avec une page html qui utilise un contenu dynamique.C# Le contrôle du navigateur Web n'est pas mis à jour correctement

Mon problème est que lorsque j'essaie d'ajouter des données au WBC, le contenu ne se met pas à jour correctement.

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; 
      } 
     } 
    } 
} 

Ce qui se passe actuellement est, je clique sur « ajouter » il faut ajouter le code HTML à la page et la mise à jour et le javascript et ce qui ne devrait toujours charger. Qu'est-ce qui se passe, c'est qu'il ajoute le contenu, mais le javascript ne fonctionne pas après avoir essayé de recharger le contenu. La CSS reste intacte cependant, et le javascript ne fonctionne pas après ce point.

JS Source:

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; 
} 

Répondre

2

TL; DR: Avez-vous essayé d'installer "AllowNavigation" true?

Si vous avez besoin pour empêcher la navigation, mais encore besoin de mettre à jour la page, une méthode que j'ai trouvé qui fonctionne nécessite:

  • Initialiser la propriété du contrôle WebBrowser DocumentText avec vide HTML pour initialiser les objets internes (à savoir: Document, DomDocument, Document.Body, etc.)
  • Permettre la navigation et la révocation à la fin de la page (si nécessaire)

code:

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); 
     } 
    } 
} 

J'ai trouvé cette façon de faire:

  • empêche les utilisateurs de naviguer jusqu'à permis
  • Permet l'exécution de JavaScript (immédiatement avant OnDocumentCompleted incendies)
Questions connexes