我在 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 文件中获取特定内容,并且它工作我之前单独检查了这个函数。
问题是我如何使用户通过单击/键输入选择索引以及如何解析和显示它?