如何将选定的组合框和文本框文本写入文本文件中的特定行

时间:2018-11-14 01:06:39

标签: c# winforms

试图将所选的comboBox和textBox文本保存到文本文件。 但是有多个值被保存。

为避免混淆,将它们系统地保存在文本文件的特定行中将有助于识别这些值。

尝试使用以下方法,但应用程序挂起。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApp1
{
  public partial class Setups : Form
   {
    public Setups()
    {
        InitializeComponent();
        //this.TopMost = true;
        //this.FormBorderStyle = FormBorderStyle.None;
        //this.WindowState = FormWindowState.Maximized;

    }
    private void textBox8_TextChanged(object sender, EventArgs e)
    {

    }
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {



    }

    static void lineChanger(string newText, string fileName, int line_to_edit)
    {
        string[] arrLine = File.ReadAllLines(fileName);
        arrLine[line_to_edit - 1] = newText;
        File.WriteAllLines(fileName, arrLine);
    }
    public void button5_Click(object sender, EventArgs e)
    {


        lineChanger(string.Format("{0} | {1}", comboBox1.Text, textBox8.Text), "sample.txt", 30);   //


        // Succesfully wrote to file on first line
        //StreamWriter sw = new StreamWriter("Test.txt");

        //sw.WriteLine($"{comboBox1.Text}.{textBox8.Text}");
        //sw.Close();

    }

3 个答案:

答案 0 :(得分:0)

更好的解决方案是创建一个具有所有设置的类,然后使用JSON对其进行序列化/反序列化。

使用nuget将JSON包添加到您的应用程序。序列化的示例代码:https://www.newtonsoft.com/json/help/html/SerializingJSON.htm

答案 1 :(得分:0)

挂起的应用程序和超出范围的异常是两件不同的事情。如果您需要帮助,请在问题中进行精确说明。

此外,如果在单击按钮5时读取的文件还不包含至少30行,您的lineChanger函数将显然失败。

像这样的硬编码数字在生产代码中总是一个坏主意。如果在某个时候修改了文件内容,将很难确保代码中的所有内容都已正确修复。

如果您真的想使用这样的文本文件,那么至少:

  • 使用枚举或常量为每一行定义一个位置。
  • 使用一个类来管理您的配置,以便只有那个类才能知道文件的结构。

但是,正如另一个答案中所提到的,最好使用其他格式,例如JSON。除二进制数据外,几乎所有其他格式都比文本文件更可取(假设内容是应用程序的设置)。

话虽如此,如果您真的想要lineChanger,则应该添加一个这样的测试:

if (line_to_edit >= arrLine.Length)
{
    List<string> list(arrLine);
    while (List.Length < line_to_edit) { list.Add(string.Empty); }
    list.Add(newText);
    arrLine = list.ToArray();
}
else { … old code from question… }

但是,如果您从文件中读取其他行或经常读取行,则每次修改一行时打开/读取/更新/写入/关闭文件可能会变得非常慢。最好有一个类来管理设置,以便在打开对话框时和在关闭对话框时一次加载它们(假设对话框显示的时间相对较短,这并不重要)的另一个原因是以立即保存更改。)

答案 2 :(得分:0)

我认为您的问题范围太广,需要更多详细信息

您需要考虑将表格与数据分开。创建一个数据类以保存要存储或读取的值,并使UI使用数据绑定与此类进行交互。这样,您的数据类将始终包含最新的信息。

在需要时,可以使用TextStreamBinaryFormatterXmlSerializerJSON来序列化数据文件,这取决于是否需要其他程序或其他程序访问数据。位置。您甚至可以使用内置的Settings在应用程序退出之前保存数据,并在应用程序再次启动时将其读回。

因此,请编辑问题以阐明您要使用此数据的内容,并添加一个整体示例的示例(现在,文本文件中的所有行)。然后我们可以更具体地回答。