如何从某些控件构建文本行的内容并将其写入文本文件?

时间:2016-03-02 16:29:32

标签: c# .net winforms

private void button1_Click(object sender, EventArgs e)
{
    string accountsSettingsFile = Path.GetDirectoryName(Application.LocalUserAppDataPath)
            + "\\accounts" + "\\accounts.txt";
    if (!File.Exists(accountsSettingsFile))
        File.Create(accountsSettingsFile);            
    System.IO.File.WriteAllText(accountsSettingsFile,);
}

我想在按钮点击事件中将内容写入文本文件之前构建一个字符串。也许StringBuilder并将其格式化为包含某些控件的所有数据。

我有一个textBox1textBox2textBox3一个checkBox。 我希望得到所有这些控制数据并将其写入文本文件的行。

例如,如果在textBox1"hello"textBox2 "world"以及textBox3 "hi"checkBoxfalse,那么文本文件内容应该是:

hello
world
hi
false 

3 个答案:

答案 0 :(得分:3)

我会选择这样的东西,特别是如果您的控件列表可能会在以后更长时间:

    private void button1_Click(object sender, EventArgs e)
    {
      Form1.WriteToFile(textBox1, textBox2, textBox3, checkBox);
    }

    private static void WriteToFile(params Control[] controls)
    {
        string accountsSettingsFile = Path.GetDirectoryName(Application.LocalUserAppDataPath)
        + "\\accounts" + "\\accounts.txt";

        List<string> lines = new List<string>(controls.Length);

        foreach (var control in controls)
        {
            string value = Form1.GetValueFromControl(control);

            //this will skip null entries, not sure you really
            //want to do that, otherwise when you read this file back in
            //you will have no idea which values represent which fields
            if (value != null)
                lines.Add(value);
        }

        //This will overwrite the file. 
        //If you want to append use File.AppendAllLines
        File.WriteAllLines(accountsSettingsFile, lines);
    }

    private static string GetValueFromControl(Control control)
    {
        if (control is TextBox)
        {
            return ((TextBox)control).Text;
        }

        if (control is CheckBox)
        {
            return ((CheckBox)control).Checked.ToString();
        }

        return null;
    }

但是,由于您将此用于设置,因此将原始值写入文本文件是一种非常脆弱的方法。我可以推荐使用序列化吗?虽然这需要您在项目中引用Newtonsoft.Json(通过nuget):

 private void Button_Write_Click(object sender, EventArgs e)
    {
        AccountSettings settings = new AccountSettings();
        settings.Setting1 = this.textBox1.Text;
        settings.Setting2 = this.textBox2.Text;
        settings.Setting3 = this.textBox3.Text;
        settings.CheckboxValue = this.checkBox.Checked;
        WriteJson(settings, SettingsFile);
    }

    private void Button_Read_Click(object sender, EventArgs e)
    {
        AccountSettings settings = ReadJson<AccountSettings>(SettingsFile);
        this.textBox1.Text = settings.Setting1;
        this.textBox2.Text = settings.Setting2;
        this.textBox3.Text = settings.Setting3;
        this.checkBox.Checked = settings.CheckboxValue;
    }

    private static string SettingsFile
    {
        get
        {
            return Path.GetDirectoryName(Application.LocalUserAppDataPath)
           + "\\accounts" + "\\accounts.txt";
        }
    }

    private static void WriteJson(Object obj, string path)
    {
        var ser = new JsonSerializer();
        using (var file = File.CreateText(path))
        using (var writer = new JsonTextWriter(file))
        {
            ser.Serialize(writer, obj);
        }
    }

    private static T ReadJson<T>(string path)
        where T: new()
    {
        if (!File.Exists(path))
            return new T();

        var ser = new JsonSerializer();
        using (var file = File.OpenText(path))
        using (var reader = new JsonTextReader(file))
        {
            return ser.Deserialize<T>(reader);
        }
    }

    private class AccountSettings
    {
        public string Setting1 { get; set; }
        public string Setting2 { get; set; }
        public string Setting3 { get; set; }
        public bool CheckboxValue { get; set; }
    }

}

这为您提供了一个强类型AccountSettings对象,可以以非常具体和可重复的方式进行编写和读取。

答案 1 :(得分:1)

var checked = checkBox.Checked ? "true" : "false";
var textToBeSaved = string.Format("{0}\n{1}\n{2}\n{3}", textBox1.Text, textBox2.Text, textBox3.Text,  checked)

答案 2 :(得分:1)

private void button1_Click(object sender, EventArgs e)
{
    string accountsSettingsFile = Path.GetDirectoryName(Application.LocalUserAppDataPath)
            + "\\accounts" + "\\accounts.txt";
    if (!File.Exists(accountsSettingsFile))
        File.Create(accountsSettingsFile);     

    //New Code
    StringBuilder accountText = new StringBuilder();
    accountText.AppendLine(textbox1.Text);
    accountText.AppendLine(textbox2.Text);       
    accountText.AppendLine(textbox3.Text);
    accountText.AppendLine(checkbox.Checked.ToString().ToLowerInvariant());
    //Above line assumes you want a trailing newline
    System.IO.File.WriteAllText(accountsSettingsFile, accountText.toString());
}

当然,这是非常无聊的,并且不是特别可扩展的,如果你想生成一次输入多个帐户的动态页面,你可以使用Page.FindControl循环浏览文本框和将所有这些都附加到文件中。