C# 使用c在文件中保存combox值#

C# 使用c在文件中保存combox值#,c#,combobox,textbox,streamreader,C#,Combobox,Textbox,Streamreader,我正在编写一个小程序,它显示我的待办事项、优先级等。在这个程序中,我有两个选项卡:选项卡1用于创建新的待办事项,另一个选项卡用于显示当前的待办事项。因此,当我在选项卡1的文本框中输入一些文本,并单击“保存”按钮后,它应该将其保存在选项卡2的组合框中。当我重新启动程序时,它仍然应该被保存。谷歌让我用一个文件来做这件事,这样我就可以把它保存到一个文件中。我发现了一个简短的代码,我根据我的程序进行了调整。在这里您可以看到我的代码: private void Form1_Load(object send

我正在编写一个小程序,它显示我的待办事项、优先级等。在这个程序中,我有两个选项卡:选项卡1用于创建新的待办事项,另一个选项卡用于显示当前的待办事项。因此,当我在选项卡1的文本框中输入一些文本,并单击“保存”按钮后,它应该将其保存在选项卡2的组合框中。当我重新启动程序时,它仍然应该被保存。谷歌让我用一个文件来做这件事,这样我就可以把它保存到一个文件中。我发现了一个简短的代码,我根据我的程序进行了调整。在这里您可以看到我的代码:

private void Form1_Load(object sender, EventArgs e)
{
    // Check if directory exists
    if (Directory.Exists(@"C:\Users\rs\Desktop\Test\)"))
    {
        // Do nothing
    }

    else
    {
        Directory.CreateDirectory(@"C:\Users\rs\Desktop\Test\");
    }

    if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
    {
        // Do nothing
    }

    else
    {
        File.Create(@"C:\Users\rs\Desktop\Test\test.txt");
    }

    StreamReader sr = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt");
    while (sr.Peek() >= 0)
    {
        combox_Name2.Items.Add(sr.ReadLine());
    }
    sr.Close();
}

private void btn_Save_Click(object sender, EventArgs e)
{

    StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true);

    try
    {
        Process.Start(combox_Name2.Text, txt_Name.Text);

        if (combox_Name2.Items.Contains(txt_Name.Text))
        {
            // Do nothing
        }

        else
        {
            writer.WriteLine(combox_Name2.Text);
            writer.Flush();
            writer.Dispose();
            combox_Name2.Items.Add(txt_Name.Text);
        }
    }

    catch
    {
        MessageBox.Show("The file '" + txt_Name.Text + "' could not be located", "File could not be located");
    }
}
我现在的问题是:每次我启动程序,在文本框中输入一些文本,然后点击保存按钮,就会出现一个错误

StreamReader sr=newstreamreader(@“C:\Users\rs\Desktop\Test\Test.txt”)

VS2012表示进程无法进入
C:\Users\rs\Desktop\Test\Test.txt
,因为它已在另一个进程中启动

有人能给我一个提示吗


Cheers

StreamWriter阻止您这样做,您必须在流程中使用文件之前关闭它,或者您必须在字符串中进行更改,而不是在流程存在时更新文件中的更改。

StreamWriter阻止您这样做,您必须在流程中使用文件之前关闭它,或者您必须在字符串,然后在进程存在时更新对文件的更改。

您忘记关闭/处置写入程序。这对读者也很重要。你应该习惯这样写:

using(StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true))
{
    // do your thing here.

}
StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true);
try
{
    // do your thing here.

}
finally
{
    writer.Dispose();
}
这将始终关闭流,即使在内部抛出异常时也是如此

这将按如下方式进行编译:

using(StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true))
{
    // do your thing here.

}
StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true);
try
{
    // do your thing here.

}
finally
{
    writer.Dispose();
}
实际问题在于:File.Create(@“C:\Users\rs\Desktop\Test\Test.txt”)

文件已创建,但您没有引用结果。声明
公共静态文件流创建(
字符串路径
)
这会将结果(FileStream)发送到垃圾中,并在垃圾回收器收集时进行处理。你不知道这是什么时候发生的。该文件将保持打开状态,直到垃圾收集完毕。您可以删除整个行。如果文件不存在,请不要执行StreamReader部分

combox_Name2.Items.Clear();
if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
{
    using(StreamReader sr = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt"))
    {
        while (sr.Peek() >= 0)
        {
            combox_Name2.Items.Add(sr.ReadLine());
        }
    }
}

别忘了取下盖子!在文件.Exists处。

您忘记关闭/处置写入程序。这对读者也很重要。你应该习惯这样写:

using(StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true))
{
    // do your thing here.

}
StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true);
try
{
    // do your thing here.

}
finally
{
    writer.Dispose();
}
这将始终关闭流,即使在内部抛出异常时也是如此

这将按如下方式进行编译:

using(StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true))
{
    // do your thing here.

}
StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true);
try
{
    // do your thing here.

}
finally
{
    writer.Dispose();
}
实际问题在于:File.Create(@“C:\Users\rs\Desktop\Test\Test.txt”)

文件已创建,但您没有引用结果。声明
公共静态文件流创建(
字符串路径
)
这会将结果(FileStream)发送到垃圾中,并在垃圾回收器收集时进行处理。你不知道这是什么时候发生的。该文件将保持打开状态,直到垃圾收集完毕。您可以删除整个行。如果文件不存在,请不要执行StreamReader部分

combox_Name2.Items.Clear();
if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
{
    using(StreamReader sr = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt"))
    {
        while (sr.Peek() >= 0)
        {
            combox_Name2.Items.Add(sr.ReadLine());
        }
    }
}

别忘了取下盖子!在.Exists文件中。

始终将实现IDisposable接口的对象放置在

using(IDisposable object goes here)
{
    // Do something.
}

在您的例子中,StreamWriter对象。

始终将实现IDisposable接口的对象放置在

using(IDisposable object goes here)
{
    // Do something.
}

在您的情况下,StreamWriter对象。

以下代码将实现您的目标。如果有效的话,做标记作为答案

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.IO;
using System.Diagnostics;

namespace FileHandling
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Check if directory exists
        if (Directory.Exists(@"C:\Users\rs\Desktop\Test\)"))
        {
            // Do nothing
        }

        else
        {
            Directory.CreateDirectory(@"C:\Users\rs\Desktop\Test\");
        }

        if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
        {
            // Do nothing
        }

        else
        {
            File.Create(@"C:\Users\rs\Desktop\Test\test.txt");
        }

        using (StreamReader writer = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt"))
        {
            while (writer.Peek() >= 0)
            {
                combox_Name2.Items.Add(writer.ReadLine());
            }
            writer.Close();
        }

    }

    private void btn_Save_Click(object sender, EventArgs e)
    {
        using (StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true))
        {
            try
            {
                if (combox_Name2.Items.Contains(txt_Name.Text))
                {
                    MessageBox.Show("The task '" + txt_Name.Text + "' already exist in list", "Task already exists");
                }

                else
                {
                    combox_Name2.Items.Add(txt_Name.Text);
                    writer.WriteLine(txt_Name.Text);
                    writer.Flush();
                    writer.Dispose();
                }
            }

            catch
            {
                MessageBox.Show("The file '" + txt_Name.Text + "' could not be located", "File could not be located");
            }

        }
    }
}
}

以下代码将实现您的目标。如果有效的话,做标记作为答案

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.IO;
using System.Diagnostics;

namespace FileHandling
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Check if directory exists
        if (Directory.Exists(@"C:\Users\rs\Desktop\Test\)"))
        {
            // Do nothing
        }

        else
        {
            Directory.CreateDirectory(@"C:\Users\rs\Desktop\Test\");
        }

        if (File.Exists(@"C:\Users\rs\Desktop\Test\test.txt"))
        {
            // Do nothing
        }

        else
        {
            File.Create(@"C:\Users\rs\Desktop\Test\test.txt");
        }

        using (StreamReader writer = new StreamReader(@"C:\Users\rs\Desktop\Test\test.txt"))
        {
            while (writer.Peek() >= 0)
            {
                combox_Name2.Items.Add(writer.ReadLine());
            }
            writer.Close();
        }

    }

    private void btn_Save_Click(object sender, EventArgs e)
    {
        using (StreamWriter writer = new StreamWriter(@"C:\Users\rs\Desktop\Test\test.txt", true))
        {
            try
            {
                if (combox_Name2.Items.Contains(txt_Name.Text))
                {
                    MessageBox.Show("The task '" + txt_Name.Text + "' already exist in list", "Task already exists");
                }

                else
                {
                    combox_Name2.Items.Add(txt_Name.Text);
                    writer.WriteLine(txt_Name.Text);
                    writer.Flush();
                    writer.Dispose();
                }
            }

            catch
            {
                MessageBox.Show("The file '" + txt_Name.Text + "' could not be located", "File could not be located");
            }

        }
    }
}
}

如果(!File.Exists(@“C:\Users\rs\Desktop\Test\Test.txt”)
导致
不存在(
),什么都不做就什么都不做:)谢谢我编辑了我的代码,所以没有
//不再做任何事了:)但这不是原因:如果(!File.Exists(@“C:\Users\rs\Desktop\Test\Test\Test.txt”)
导致
不存在(
),什么都不做什么也不做:)谢谢我编辑了我的代码,这样就没有了
//什么都不做了:)但这不是原因:o^^谢谢你的回答。我还是会出错:/也许我做错了什么?如果我使用
using(StreamWriter writer=newstreamwriter(@“C:\Users\rs\Desktop\Test\Test.txt”,true)){//在这里做你的事。}
我必须将
try
放入
{}
中。这是正确的吗?请耐心点,我是新手:)不,你不需要在那里写
试试
,除非你想在那里处理异常。如果将
try
放入
{}
中,则可以在文件仍处于打开状态时处理异常。如果使用(…)
将try放在
之外,则在处理异常时文件将关闭。因此
使用
不会处理异常,但在离开
{}
范围之前总是调用内部对象的
dispose
,但是如果我使用
使用
,我就不能使用
writer.WriteLine(combox\u Name2.text)例如,因为
StreamWriter writer
位于
()
中。我就是不明白。阅读:使用语句(C#Reference)是的,该语句帮助我理解了
使用
以及我现在理解的另一个答案的原因我在哪里犯了错误。谢谢你的支持:)谢谢你的回答。我还是会出错:/也许我做错了什么?如果我使用
using(StreamWriter writer=newstreamwriter(@“C:\Users\rs\Desktop\Test\Test.txt”,true)){//在这里做你的事。}
我必须将
try
放入
{}
中。这是正确的吗?请耐心点,我是新手:)不,你不需要在那里写
试试
,除非你想在那里处理异常。如果将
try
放入
{}
中,则可以在文件仍处于打开状态时处理异常。如果使用(…)
将try放在
之外,则在处理异常时文件将关闭。因此,使用
不会处理异常,而是在离开作用域
{}dispose