C#GUI保存输入文本(TextBox)

时间:2017-08-09 09:45:14

标签: c# windows winforms user-interface textbox

我对C#很陌生,在制作我的第一个程序时我遇到了问题。

所以我有3个窗口(MyForm1; MyForm2 and MyForm3)

MyForm1有2个按钮(可用帐户和添加新帐户) 当我单击其中一个按钮时,它会打开一个新的窗体。

在添加新帐户表单中,我有2 TextBox(1为ID,1为PWD +按钮(保存),我希望用户输入他的ID和PWD并保存,所以我可以在可用帐户表格中重复使用它,但我不知道如何做到这一点。我尝试了我在YT上看到的不同的东西,但似乎没有任何东西像我一样

感谢您的帮助< 3(如果您希望我复制/粘贴部分代码,请告诉我。)

修改

以下是上述表格的源代码。

我删除了所有失败的尝试,因此它们是基础知识。

3 个答案:

答案 0 :(得分:1)

从您的帖子中很难确定您尝试做什么。所以。如果您只想在表单之间传递值,可以执行以下操作:

添加新的帐户表单:

public static bool AddNewAccount(out int id, out string password)
{
    id = 0;
    password = "";

    AddNewAccountForm f = new AddNewAccountForm();
    bool result = (f.ShowModal() == ModalResult.OK);

    if(result)
    {
       id = f.GetId();
       password = f.GetPassword();
    }

    f.Dispose();
    return result;
}

以主要形式:

int id;
string pass;

if(AddNewAccountForm.AddNewAccount(out id, out pass))
{
   //here user clicked OK, so you can save to the database your id and password
}
else
{
   //here user clicked Cancel
}

我认为AddNewAccountForm上有两个按钮。一个 - 好的和另一个 - 取消。您必须为这些按钮设置模态结果。

那么,它是如何工作的? AddNewAccount方法是静态方法,因此您可以从主要方法调用它:

AddNewAccountForm.AddNewAccount()

AddNewAccount方法将创建表单,以模态方式显示,然后将用户enetred的值分配给out参数。

我的代码还假设您的AddAccountForm具有以下方法:

int GetId()
{
   return Convert.ToInt32(idTextBox.Text);
} 

string GetPassword()
{
   return passwordTextBox.Text;
}

请注意,GetId编写得很糟糕,我希望它清楚。现在你已经理解了这个方法,转换为int应该是这样的(TryParse是将字符串转换为int的更好方法):

int GetId()
{
    int id;
    if(!int.TryParse(idTextBox.Text, out id))
      return -1;
    else
      return id;
}

你也可以"分组"某些结构中的id和密码。代码会更清晰。但我认为你现在不需要它。但是,如果您很好奇,可以在此处阅读有关结构的信息:https://msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx?f=255&MSPPError=-2147217396

如果要在数据库或文件中存储值:

** 关于良好做法和系统工程的部分 **

你真的不应该使用AddAccountForm保存它们。这个类是在你的应用程序中创建帐户(只是模型) - 而不是保存它。如果你想存储这些值(id和密码),你应该将它们传递给你的主表单 - 正如我已经向你展示过,然后主表单应该保存它们 - 使用另一个负责数据管理的类。我没有给出任何例子,因为我现在不知道你是否真的需要它。

答案 1 :(得分:1)

为了使您的代码真正可重用,您应该在显示(视图)和数据之间保持严格的分离。

你没有提到你有一个数据库。缺乏提及是这种分离的开始。如果您只有一个帐户列表或一个词典,或者包含您要在应用程序中编辑的项目的文本文件,您的问题就会类似。

因此,我们假设您要编辑Accounts的集合。您希望能够向此集合添加帐户,或更改此集合中现有帐户的数据。

此功能类似于ICollection<Account>的功能。

所有Form1需要知道的是它拥有ICollection<Account>。初始化期间Form1以某种方式加载Accounts集合。如果操作员按下添加,则会打开Form2,他可以在其中填写新帐户所需的值。操作员选择OKCancel表示他希望将此帐户添加到集合中(使用表单中的“保存”按钮不是Windows标准且有点不清楚,所以不要用它)。

添加帐户

Form1

中的代码
private ICollection<Account> existingAccounts;

void OnButtonAdd(object sender, ...)
{
    using (var form = new Form2())
    {
         form. ...// fill any needed values

         // show form2 and check if OK or Cancel:
         var dlgResult = form.ShowDialog(this);

         // only add if OK pressed, otherwise ignore
         if (dlgResult == DialogResult.OK)
         {
             this.existingAccounts.Add(form.Account);
         }
    }
}

Form2

中的Cond

在visual studio designer中创建一个Form,其中包含用于ID的TextBox和用于密码的文本框(为其提供密码属性,因此显示*****)

添加“确定”和“取消”按钮。为这些按钮的DialogResult属性指定正确的OK和Cancel值。

最后添加一个属性以获取键入的值:

public Account Account
{
    get
    {   // extract the values from the display
        return new Account()
        {
            Id = this.TextBoxId.Text,
            Pwd = this.TextBoxPwd.Text,
        };
     }
 }

修改现有帐户

您还可以使用按钮编辑现有帐户。您是否只想编辑上次添加的帐户,还是希望能够编辑任何现有帐户?

在后一种情况下,您必须制作一些显示所有现有帐户的内容,操作员可以在其中选择其中一个帐户。可能使用DataGridView或BindingSource。你最终可能会得到像这样的函数:

Account GetSelectedAccount() {...}

编辑现有帐户的表单与创建新帐户的表单类似。你应该考虑使用相同的表格。

public Account Account
{
    get
    {   // extract the values from the display
        return new Account()
        {
            Id = this.TextBoxId.Text,
            Pwd = this.TextBoxPwd.Text,
        };
     }
     set
     {
         this.TextBoxId.Text = value.Id;
         this.TextBoxPwd.Text = value.Pwd;
     }
 }

在form1中,按下编辑:

void OnButtonEdit_Click(object sender, ...)
{
    using (var form = new FormEdit())
    {
        Account accountToEdit = this.GetSelectedAccount();
        form.Account = accountToEdit;
        // or: GetLastAddedAccount if you only want to edit the last added one

        var dlgResult = form.ShowDialog(this);
        if (dlgResult == DialogResult.OK)
        {   // extract the edited Account from the form:
            Account editedData = form.Account;
            this.UpdateSelectedAccount(editedData);
        }
    }
}

与上面的示例一样,我通常决定使用一个带有属性的接口来插入和提取Accounts,而不是分别访问每个Account属性。这允许您更改帐户的内部,而无需更改此帐户的所有(软件)用户

答案 2 :(得分:0)

关于在表单之间传递数据,所以你可以使用以下方法之一:

  • 在公共字符串中设置用户输入,以便您可以通过输入表单对象访问其他表单中的字符串。

  • 您可以将用户输入作为构造函数参数传递,然后使用表单中的数据。

  • 还有其他多种方式,例如委托,但我认为之前的两种方式很简单。