0

Form1 にこのコードがあります。xmlファイルを検索しています。それらが listBox1 selected index changed イベントを使用しているのを見つけた場合、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 にオプションを追加して、ユーザーがアイテム間を移動できるようにしました。

ここで私がしたいのは、ユーザーが listBox でインデックス [1] などのインデックスを選択し、キーボードで入力をクリックした場合、またはマウスの左クリックでクリックした場合にのみ、ParseAndDisplayXML 関数を呼び出し/使用することです。

次に、ファイルに変換する必要がある選択されたインデックスを解析するため、backgroundWorker1_RunWorkerCompleted イベントで、ファイルを項目として listBox に追加しますが、ファイルの名前のみを使用します。.Name の代わりに .FullName を実行した場合、ディレクトリにファイル名も追加されていました。

そのため、完了したイベントでファイルの FullName を取得する必要があり、FullName 項目の 1 つを選択して解析し、listBox に表示すると思います。

解析機能は、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 に答える