Как использовать C # для отображения результатов реестра в Rich Text Box? - PullRequest
0 голосов
/ 16 ноября 2010

У меня есть программа, которая может извлекать различные значения реестра, используя коды C #, которые были скомпилированы и созданы с использованием VS 2010.

Однако проблема возникает, когда я пытался отобразить результаты, полученные из реестра Windows, в расширенное текстовое поле в форме.

Форма показывает только 1 строку, которая является последним значением в массиве, который содержит результаты.

Пожалуйста, дайте несколько советов по кодам. Спасибо!

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)
    {

    }
   }
 }

Ответы [ 5 ]

4 голосов
/ 16 ноября 2010

Говоря:

richTextBoxBrowsing.Text=

на каждой итерации цикла, вы продолжаете перезаписывать текст.Таким образом, будет напечатан только последний вызов свойства Text.

Вам необходимо установить для свойства richTextBoxBrowsing.TextMode значение multiline, а затем вместо этого вызвать:

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

Oh, и, кстати,, используйте: string val = rk.GetValue(s).ToString();

, чтобы вы могли удалить объявление int i = 0;

1 голос
/ 16 ноября 2010

Вы должны использовать richTextBoxBrowsing.AppendText(...)

1 голос
/ 16 ноября 2010

Вы меняете все содержимое при каждом вызове, вместо добавления к нему:

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

должно быть

richTextBoxBrowsing.AppendText(s+" contains " + val+Environment.NewLine);
1 голос
/ 16 ноября 2010
  • Подтвердите, что вы установили richTextBoxBrowsing.TextMode до MultiLine
  • Изменение richTextBoxBrowsing.Text+=s + " contains " + val; в цикле foreach
  • Используйте Debug.WriteLine для отладки возврата значение
0 голосов
/ 16 ноября 2010

Я думаю, что ваш цикл неправильный.

В _void PrintKeys()_ ваш цикл переопределяет ваш RichTextBox.Text-Value попробуйте что-то вроде:

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

RichTextBox.text = temp;
...