如何保存来自动态创建的文本框的文本

时间:2018-07-27 12:53:12

标签: c# winforms textbox passwords

Howdy我有一个表单,其中包含标签和文本框,其中将包含程序创建的文件夹的密码。每次他们单击“保存新密码”按钮时,都会在表单上创建一个新的文本框和标签。我想保存密码,以便如果他们对文件夹进行更改,它将询问他们是否要保留更改,然后必须输入该文件夹的密码。我的问题是如何将该密码保存到该文件夹​​。他们可以根据需要在设置中添加或删除密码。这是我用来创建新文本框的代码。文本框和标签中的文本仅用于测试。 showand仅在此处显示用于测试目的

public partial class Passworddata : Form
{
    public List<TextBox> TextBoxes = new List<TextBox>();
    public List<Label> labels = new List<Label>();
    public Passworddata()
    {

        InitializeComponent();
    }

    private void Button1_Click(object sender, EventArgs e)
    { 
        TextBox tb = new TextBox();
        Label labl = new Label();

        int i = TextBoxes.Count + 1;
        tb.Location = new Point(30,i *30);
        labl.Location = new Point(1,i*30);
        tb.Width = 30;
        tb.Name = "ID" + i;
        labl.Text = "hi";
        tb.Text = "hello";
        TextBoxes.Add(tb);
        labels.Add(labl);
        Forms.list.Panel1.Controls.Add(tb);
        Forms.list.Panel1.Controls.Add(labl);
        Forms.list.Show();

    }




}

2 个答案:

答案 0 :(得分:1)

最好创建一个包含标签和密码的用户控件。然后,不必依赖两个项目列表,您只需拥有一个。

创建一个UserControl并在其上放置一个标签和一个文本框。

您还应该添加一个Changed属性:

public bool PasswordChanged { get; set; } = false;

为密码创建一个公共属性:

public string Password
{
    get
    {
        return(textbox1.Text);
    }
    set
    {
        textbox1.Text = value;
        Changed = false;
    }
}

,其中一个用于目录标签:

public string Directory
{
    get
    {
        return(label1.Text);
    }
    set
    {
        label1.Text = value;
    }
}

在文本框中,从设计器中订阅TextChanged事件,然后在放置的处理程序代码中:

Changed = true;

在主窗体上放置一个FlowLayoutPanel和一个Add按钮。

然后,当您单击添加按钮时,可以添加密码用户控件的新实例:

public void Add_Click(object sender, EventArgs e)
{
    Password pwd = new Password();
    flowlayoutpanel1.Controls.Add(pwd);
}

在表单加载事件中,您可以读取文件并创建密码控件:

假设您将目录/密码存储在一个名为PasswordEntry的类中:

public void Form_Load(object sender, EventArgs e)
{
    List<PasswordEntry> entries = LoadEntries(@"C:\YourFile");
    foreach(PasswordEntry entry in entries)
    {
        Password pwd = new Password() { Directory = entry.Directory, Password = entry.Password };
        flowlayoutpanel1.Controls.Add(pwd);
    }
}

然后,您可以完全覆盖文件或仅更新更改的条目来标识并保存更改。

要只获取更改的条目,可以使用一些linq:

foreach(Password pwd in flowlayoutpanel1.Controls.OfType<Password>().Where(p => p.Changed).ToList())
{
    SaveChange(pwd.Directory, pwd.Password);
}

假设您有一个名为SaveChange的方法,该方法采用目录字符串和密码字符串,并且知道如何写回文件。

答案 1 :(得分:0)

如果要专门保存控件和数据,我建议以下内容:

要保存:

  1. 当用户添加值时,构建一个像这样的字符串:

    string currentEntry = tb.Name + "|" + tb.Text.Replace("|","~") + "|" + labl.Text;
    
  2. 然后只需使用File.AppendAllText方法,如下所示:

    File.AppendAllText("SavedData.dat", currentEntry);
    

要加载:

  1. 订阅Form.Load表单的Forms.list事件
  2. 读取保存的数据文件(如果存在)
  3. 解析每一行以获取所需的值
  4. Form.Load
  5. 中创建并添加控件

因此,很明显,在处理Form.Load的{​​{1}}事件的方法内部,您将看到类似以下代码的内容:

Forms.list