2010-11-16 21 views
0

J'ai un programme qui est capable de récupérer diverses valeurs de registre en utilisant les codes C# compilés et créés en utilisant VS 2010.Comment utiliser C# pour afficher les résultats du registre sur la zone de texte enrichi?

Cependant, le problème se pose lorsque j'essaie d'afficher les résultats récupérés du registre Windows dans un texte enrichi boîte dans un formulaire.

Le formulaire affiche uniquement 1 ligne qui est la dernière valeur dans le tableau qui contient les résultats.

Veuillez donner quelques conseils sur les codes. Merci!

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Microsoft.Win32; 

namespace Syscrawl 
{ 
public partial class FTK_Menu_Browsing_History : Form 
{ 
    public FTK_Menu_Browsing_History() 
    { 
     InitializeComponent(); 
    } 

    private void buttonFileHistory_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     FTK_Menu_File_History mfh = new FTK_Menu_File_History(); 
     mfh.ShowDialog(); 
     this.Close(); 
    } 

    private void buttonEncryptedFiles_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     FTK_Menu_Encrypted_Files mef = new FTK_Menu_Encrypted_Files(); 
     mef.ShowDialog(); 
     this.Close(); 
    } 

    private void buttonRecentlyAccessedFiles_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     FTK_Menu_Recently_Accessed_Files mraf = new FTK_Menu_Recently_Accessed_Files(); 
     mraf.ShowDialog(); 
     this.Close(); 
    } 

    private void buttonRegistryHistory_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     FTK_Menu_Registry_History mrh = new FTK_Menu_Registry_History(); 
     mrh.ShowDialog(); 
     this.Close(); 
    } 

    private void buttonMainMenu_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     Menu m = new Menu(); 
     m.ShowDialog(); 
     this.Close(); 
    } 

    private void buttonLogOut_Click(object sender, EventArgs e) 
    { 
     this.Hide(); 
     Syscrawl_Login sl = new Syscrawl_Login(); 
     sl.ShowDialog(); 
     this.Close(); 
    } 

    private void FTK_Menu_Browsing_History_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      RegistryKey rk = Registry.CurrentUser; 

      rk = rk.OpenSubKey("Software\\Microsoft\\Internet Explorer\\TypedURLs", 
    false); 
      PrintKeys(rk); 
      rk.Close(); 
     } 
     catch (Exception MyError) 
     { 
      richTextBoxBrowsing.Text="An error has occurred: " + MyError.Message; 
     } 
    } 

    void PrintKeys(RegistryKey rk) 
    { 
     if (rk == null) 
     { 
      richTextBoxBrowsing.Text="Couldn't open the desired subkey."; 
      return; 
     } 

     richTextBoxBrowsing.Text = "Subkeys of " + rk.Name; 

     try 
     { 
      string[] valnames = rk.GetValueNames(); 
      int i = 0; 

      foreach (string s in valnames) 
      { 
       string val = (string)rk.GetValue(valnames[i++]); 

     richTextBoxBrowsing.Text="-----------------------------------------------"; 
       richTextBoxBrowsing.Text=s + " contains " + val; 
      } 
     } 

     catch (Exception MyError) 
     { 
      richTextBoxBrowsing.Text = "An errors has occurred: " + MyError.Message; 
     } 
    } 

    private void richTextBoxBrowsing_TextChanged(object sender, EventArgs e) 
    { 

    } 
    } 
} 
+0

Une suggestion: lorsque vous publiez du code, n'incluez que les parties pertinentes (les événements Click n'étaient pas liés au problème de zone de texte) – Rox

Répondre

4

En disant:

richTextBoxBrowsing.Text= 

à chaque itération de la boucle, vous continuez à écraser le texte. Ainsi, seul le dernier appel à la propriété Text est imprimé.

Vous devez définir la richTextBoxBrowsing.TextMode propriété à multiligne, puis au lieu appeler:

richTextBoxBrowsing.AppendText(s + " contains " + val + "\n"); 

Oh, et par la manière, utilisez: string val = rk.GetValue(s).ToString();

afin que vous puissiez retirer la déclaration int i = 0;

1
  • Vérifiez que vous définissez richTextBoxBrowsing.TextMode à MultiLine
  • changement richTextBoxBrowsing.Text+=s + " contains " + val; en boucle foreach
  • Utilisez Debug.WriteLine pour déboguer retour valeur
+0

Pourriez-vous fournir des codes pour la multiligne? et déboguer? Merci. – JavaNoob

+0

@JavaNoob J'ai mis à jour le message et liez Debug.WriteLine. Cela pourrait être utile. Et je pense que si vous faites les deux premières étapes d'en haut votre problème sera résolu. –

+0

Ajouté rep pour réponse correcte partielle. – JavaNoob

1

Vous devez utiliser richTextBoxBrowsing.AppendText(...)

1

Vous êtes en train de changer le contenu à chaque appel, au lieu d'ajouter à elle:

richTextBoxBrowsing.Text=s + " contains " + val; 

devrait être

richTextBoxBrowsing.AppendText(s+" contains " + val+Environment.NewLine); 
+0

Il montre tous les résultats maintenant mais tout est groupé ... Comment puis-je faire pour montrer ligne par ligne? Merci. – JavaNoob

+0

@JavaNoob: édité pour ajouter le code de nouvelle ligne: Vous ajoutez Environment.NewLine à la fin de la chaîne que vous voulez ajouter, et qui utilisera le nouveau caractère de ligne – Rox

+0

Ajouté rep pour réponse correcte partielle. – JavaNoob

0

Je pense que votre boucle est pas correct.

Dans _void PrintKeys()_ votre boucle overwerites votre RichTextBox.Text-Value essayer quelque chose comme:

String temp = "-----------------------------------------------"; 
foreach (string s in valnames) 
{ 
    String val = (String)rk.GetValue(valnames[i++]);     
    temp=temp+s + " contains " + val; 
} 

RichTextBox.text = temp; 
+0

Vous devez utiliser un StringBuilder plutôt que d'ajouter de manière répétée du texte à une chaîne. – Murph

+0

Je sais, mais comme cela a souvent été discuté auparavant, je dépends de la quantité de cordes que vous avez réellement concaténées. Dans ce petit exemple, je pense que cela ne devrait pas avoir d'importance. – basti