1

間違った用語を使用している場合は事前にお詫び申し上げます。

リストボックスに4つのテキストフィールドを追加し、リストボックスの1つのレコードの一部またはすべてのフィールドを編集し、4つのフィールドすべてを削除する(単一のレコードで)という3つのことを行うC#でプログラムを作成しようとしています。

データをテキストファイル「test1.txt」に保存し、StreamWriter を使用してファイルを書き込み、StreamReader を使用して読み取ります。レコードを追加することはできましたが、レコードを削除または編集することはできません。これは私のコードがどのように見えるかです:

string path = "test1.txt";   
int index = -1;       
public Form1()    
{InitializeComponent();}    

private void Form1_Load(object sender, EventArgs e)  
    {   
        readFile();    
    }

private void readFile()
    {    
        displayEventsBox.Items.Clear();  
        StreamReader sr = new StreamReader(path);  
        string record = sr.ReadLine();  
            {   
                displayEventsBox.Items.Add(record);    
                record = sr.ReadLine();    
            }    
        sr.Close();  
    }


private void displayEventsBox_SelectedIndexChanged(object sender, EventArgs e)
    {     
        index = displayEventsBox.SelectedIndex;   
        if (index > -1)   
            {    
                string record = displayEventsBox.Items[index].ToString();    
                char[] delim = { ',' };    
                string[] tokens = record.Split(delim);    
                txtTaskName.Text = tokens[0];    
                txtTaskDescription.Text = tokens[1];     
                txtDateCreated.Text = tokens[2];     
                txtDateCompleted.Text = tokens[3];    
            }  
    }

private void butAddTask_Click(object sender, EventArgs e)
    {
        StreamWriter sw = new StreamWriter(path, true);   
        sw.WriteLine(txtTaskName.Text + "," + txtTaskDescription.Text + "," + txtDateCreated.Text + "," + txtDateCompleted.Text);   
        sw.Close();   
        readFile();   
        clearText();}

private void butEditTask_Click(object sender, EventArgs e)   
    {
        File.Delete(path);    
        StreamWriter sw = new StreamWriter(path, true);    
        for (int i = 0; i < displayEventsBox.Items.Count; i++)    
            {    
                if (i != index)   
                    {
                        sw.WriteLine(displayEventsBox.Items[i].ToString());
                    }   
                else   
                    {
                        sw.WriteLine(txtTaskName.Text + "," + txtTaskDescription.Text + "," + txtDateCreated.Text + "," + txtDateCompleted.Text);
                    }   

            }   

    }

private void butDeleteTask_Click(object sender, EventArgs e)
    {   
        File.Delete(path);   
        StreamWriter sw = new StreamWriter(path, true);    
        for (int i = 0; i < displayEventsBox.Items.Count; i++)    
            {   
                if (i != index)// write from listbox    
                    {
                        sw.WriteLine(displayEventsBox.Items[i].ToString());
                    }    

            }    
                sw.Close();    
                readFile();    

    }

誰かがレコードを削除または更新できない理由を特定するのを手伝ってくれませんか

ここで明確にするのに役立つ場合は、コード内のすべてへのリンク http://collabedit.com/83rev

4

2 に答える 2

2

私が言ったように、あなたの問題はおそらくreadfile1つのアイテムしかロードしないことです。試してみてください

using(StreamReader sr = new StreamReader(path))
{
     string record;
     while((record = sr.ReadLine()) != null)
     {   
         displayEventsBox.Items.Add(record);
     }
}    

それとは別に、一度ロードしたら、これからロードする必要はありません。アイテムを追加する代わりに...

次のことを試してください。

string s = txtTaskName.Text + "," + txtTaskDescription.Text + "," 
              + txtDateCreated.Text + "," + txtDateCompleted.Text;
displayEventsBox.Items.Add(s);

編集、削除などにも同様のメソッドがあります

現在の方法の内訳は次のとおりです...

string record = sr.ReadLine();             //read a line
{                                          //Open a block that doesn't do much
     displayEventsBox.Items.Add(record);   //Add the item
    record = sr.ReadLine();                //Read the next item but ignore it
}                                          //Close the random block
于 2013-07-28T18:39:33.000 に答える
1

使用するFile.ReadAllLinesFile.WriteAllLines、あなたの生活が楽になります。read メソッドでFile.ReadAllLinesは、それを簡単にする必要があります。次に、ファイルに書き込んでからリストボックスを更新するのではなく、削除メソッドで、逆の順序で行います。最初にリストボックスから項目を削除し ( listBox1.Items.Remove(listBox1.SelectedItem);)、残りをファイルに書き出しますFile.WriteAllLines(filename, listBox1.Items.Cast<string>());readFile()すでにリストボックスを更新しているので、最後に を呼び出す必要はありません。追加と編集についても同様です。

また、他の関数はもう呼び出されていreadFileないため、そのすべてのコードを に直接入れることができますForm1_Load。また、フォームを閉じるときに一度だけ保存することもできます。

修正後の機能は次のとおりです。

    private void Form1_Load(object sender, EventArgs e) {
        displayEventsBox.Items.AddRange(File.ReadAllLines(path));
    }

    string Format() {
        return txtTaskName.Text + "," + txtTaskDescription.Text + "," + txtDateCreated.Text + "," + txtDateCompleted.Text;
    }

    private void butAddTask_Click(object sender, EventArgs e) {
        displayEventsBox.Items.Add(Format());
    }

    private void butDeleteTask_Click(object sender, EventArgs e) {
        displayEventsBox.Items.RemoveAt(displayEventsBox.SelectedIndex);
    }

    private void butEditTask_Click(object sender, EventArgs e) {
        displayEventsBox.Items[displayEventsBox.SelectedIndex] = Format();
    }

    protected override void OnClosing(CancelEventArgs e) {
        File.WriteAllLines(path, displayEventsBox.Items.Cast<string>());
        base.OnClosing(e);
    }
于 2013-07-28T18:55:33.090 に答える