如何从动态创建的文本框中保存文本

How to save the text from a dynamically created textbox

你好,我有一个包含标签和文本框的表单,其中将包含 program.Everytime 创建的文件夹的密码,他们单击“保存新密码”按钮,它会在表单上创建一个新的文本框和标签。我想保存密码,这样如果他们对文件夹进行更改,它会询问他们是否希望保留更改,然后他们必须输入该密码 folder.My 问题是如何将该密码保存到那个folder.they 可以从设置中添加或删除密码 wish.Here 是我用来创建新的代码 textboxes.The 框中的文本和标签仅适用于 testing.The称为列表的表单是文本框将显示的位置并且仅显示此处用于测试目的

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();

    }




}

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

节省:

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

    string currentEntry = tb.Name + "|" + tb.Text.Replace("|","~") + "|" + labl.Text;
    
  2. 然后简单地使用File.AppendAllText方法,像这样:

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

待加载:

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

因此,需要明确的是,在处理 Forms.listForm.Load 事件的方法中,您将拥有类似于以下代码的内容:

    if(File.Exists("SavedData.dat"))
    {
        using (StreamReader sr = new StreamReader("SavedData.dat"))
        {
            string line = "";
            while((line = sr.ReadLine()) != null)  
            {
                string[] lineData = line.Split('|');
                if(lineData.Length == 3)
                {
                    string currentTbName = lineData[0];
                    string currentTbText = lineData[1];
                    string currentLablText = lineData[2];

                    //LOAD THEM AS NORMAL
                }
            }
        }
    }

您最好创建一个封装您的标签和密码的用户控件。这样一来,您就不必依赖两个项目列表了。

创建一个 UserControl 并在其上放置一个 Label 和一个 Textbox。

您还应该添加一个已更改的 属性:

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

为密码创建一个public属性:

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 和一个添加按钮。

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

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

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

假设您将 directory/passwords 存储在一个 class 的 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 的方法,它接受目录字符串和密码字符串并且知道如何写回您的文件。