0

我在 Form1 中有这个代码。我正在搜索 xml 文件。当我使用 listBox1 选择索引更改事件找到它们时,我想这样做,当我在 lixtBox 中选择项目时,它会将其视为文件将解析它的内容并向我显示解析的内容。

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 System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;
using System.IO;
using System.Collections;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        DirectoryInfo dirinf = new DirectoryInfo(@"C:\");
        List<FileSystemInfo> fsi = new List<FileSystemInfo>();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            backgroundWorker1.RunWorkerAsync();
            button1.Enabled = false;
        }

        private void ParseAndDisplayXml(string filename)
        {
            XDocument document = XDocument.Load(filename);
            var list = document.Root.Elements("Message")
                .Select(
                e => new
                {
                    Date = e.Attribute("Date").Value.ToString(),
                    Time = e.Attribute("Time").Value.ToString(),
                    Text = e.Element("Text").Value.ToString()
                }
                );
 string result="";
            foreach (var item in list)
            {
               result += string.Format("Date--{0},Time--{1},Text--{2}", item.Date, item.Time, item.Text + Environment.NewLine);
            }
        }




        public void Search(string strExtension,
                            DirectoryInfo di,
                            List<FileSystemInfo> pResult)
        {
            try
            {

                foreach (FileInfo fi in di.GetFiles())
                {
                    if (InvokeRequired)
                    {
                        BeginInvoke(new Action(() => label2.Text = fi.Name));
                    }
                    if (fi.Name == "MessageLog.xsl")
                    {
                        foreach (FileInfo fii in di.GetFiles())
                        {
                        if (fii.Extension == strExtension)
                            pResult.Add(fii);
                        }
                        if (InvokeRequired)
                        {
                            BeginInvoke(new Action(() => label4.Text = pResult.Count.ToString() + Environment.NewLine));
                        }

                    }
                }

                    foreach (DirectoryInfo diChild in di.GetDirectories())
                        Search(strExtension, diChild, pResult);

            }
            catch (Exception e)
            {
            }
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            Search(".xml", dirinf, fsi);
            backgroundWorker1.ReportProgress(100);

        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            for (int i = 0; i < fsi.Count; i++)
            {                
                    listBox1.Items.Add(fsi[i].Name + Environment.NewLine);
            }


        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            label2.Text = listBox1.SelectedItem.ToString();
        }            
    }
}

我从 C:\ 开始搜索,然后当搜索结束时,我将找到的项目添加到 listBox1。

例如,现在在我的 listBox1 中有 4 个文件:

danny.xml adi.xml sharon.xml yoval.xml

在 selectedindexchanged 中,我添加了选项,以便用户可以在项目之间移动。

现在我想要做的是当用户在列表框中选择一些索引,例如索引 [1],并且只有当他用键盘单击输入或用鼠标左键单击时,它才会调用/使用函数:ParseAndDisplayXML。

然后它将解析需要转换为文件的选定索引,因此在 backgroundWorker1_RunWorkerCompleted 事件中,我将文件作为项目添加到 listBox 中,但仅包含文件的名称。如果我做了 .FullName 而不是 .Name 它也在添加带有目录的文件名。

因此,我需要以某种方式获取已完成事件中文件的 FullName,然后在选择 FullName 项目之一对其进行解析并将其显示在 listBox 中时。

parse 函数应该从 xml 文件中获取特定内容,并且它工作我之前单独检查了这个函数。

问题是我如何使用户通过单击/键输入选择索引以及如何解析和显示它?

4

1 回答 1

0

当您向列表框添加内容时。它需要一个对象,并将文本设置为 object.ToString()

例如

MyListBox.Add(100);

将框 100 并显示“100”

找不到 FileSystemInfo 的 ToString() 方法是否已被覆盖,但首先要尝试的是

private void backgroundWorker1_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
// newline is unnecesary and you should be using foreach
  foreach(FileSystemInfo f in fsi)
  {                
    listBox1.Items.Add(f);
  }
}
// display full name of file
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
  label2.Text = ((FileSystemInfo)listBox1.SelectedItem).Fullname;
}         

如果 FileSystemInfo.ToString() 没有返回 Name,有几种方法可以处理它。如果您不想保留 FileSystemInfo 实例,我们也可以处理。

于 2012-08-25T20:48:00.193 回答