【问题标题】:How to save the text from a dynamically created textbox如何从动态创建的文本框中保存文本
【发布时间】:2019-01-04 14:29:06
【问题描述】:

你好,我有一个包含标签和文本框的表单,其中包含程序创建的文件夹的密码。每次点击保存新密码按钮时,它都会在表单上创建一个新的文本框和标签。我想保存密码,这样如果他们对文件夹进行更改,它会询问他们是否希望保留更改,然后他们必须输入该文件夹的密码。我的问题是如何将该密码保存到该文件夹​​。如果他们愿意,他们可以从设置中添加或删除密码。这是我用来创建新文本框的代码。框和标签中的文本仅用于测试。称为列表的表单是文本框的位置显示并且仅在此处显示用于测试目的

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

    }




}

【问题讨论】:

  • 向我们展示您到目前为止所做的尝试,并展示生成文本框的代码。现阶段的问题过于宽泛和不清楚
  • 好的,我添加了代码
  • 有人能告诉我不赞成投票的目的是什么吗??我不认为 c# 中新人反对投票的问题对他们有帮助
  • 您的问题文本未格式化,您试图解释程序中不相关的部分使问题难以阅读,并且可能有数百万种方法将数据保存到文件中。您的文本框是动态生成的这一事实对将文本保存到文件的问题没有影响。除非您不知道如何获取对所述文本框的引用,否则这将是一个不同的问题。总而言之,可以做出很多改进,你能告诉我为什么你认为你的问题很好而且很清楚吗?如果你愿意,我会投票。

标签: c# winforms textbox passwords


【解决方案1】:

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

创建一个用户控件并在其上放置一个标签和一个文本框。

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

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

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 的方法,该方法接受目录字符串和密码字符串并知道如何写回您的文件。

【讨论】:

  • 感谢您的回答,它帮助我更清楚地思考我在做什么
【解决方案2】:

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

为了节省:

  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 中创建并添加控件

因此,需要明确的是,在处理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
                }
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2017-01-12
    • 2013-07-08
    相关资源
    最近更新 更多