2017-08-09 99 views
-1

我很新的C#,同时使我的第一个程序我面临一个问题。C#图形用户界面保存输入文本(TextBox)

所以我得到了3个窗口形成(MyForm1; MyForm2 and MyForm3)

MyForm1有2个按钮(可用账户&添加新帐户) 当我点击它会打开一个新的Windows窗体其中一个按钮。

在添加一个新的账户表格我有2 TextBox(1为ID和PWD +按钮(保存)1,我想用户输入他的ID和PWD并保存它,我试过不同的东西,我在YT上看到,但似乎没有任何工作,我会

感谢您的帮助< 3(告诉我,如果你想让我复制/粘贴代码的某些部分)

编辑:

这里是上述表单的源代码。

我删除了所有的失败attemps,所以他们基本知识。

+0

请分享到目前为止,你已经尝试的代码。@乔纳森Niixtay –

+0

对于您必须使用数据库将存储值即用户名和密码。 – Pirate

+0

而且...请详细解释您的实际问题在哪里。 –

回答

0

这是所有关于形式之间传递数据,因此可以使用下列之一:

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

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

  • 还有其他多种方式,如代表但我认为前面两种方法很简单。

+0

恩,谢谢你试图帮助,但我不明白:/我认为我的项目非常简单,但我可能有点过于雄心勃勃。 这个想法是制作一个存储多个英雄联盟帐户的程序,这样我就可以比打字更快地切换帐户,而不必记住所有这些帐户。 因此,Form1询问我是否想连接到一个可用的或创建一个。如果可用,选择一个账户(并且它启动了所选账户的英雄联盟),或者创建一个输入ID和PWD(在文本框中),然后将它添加到可用的acc表单中,作为输入表格中的 –

+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值。

我的代码还假定您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

如果你想存储在数据库中的值或文件:

** 部分有关良好做法和体制engeneering **

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

+0

是否可以使用类似Facebook的方式进行对话? (我不是一个恼人的人,我发誓)所以我可以给你发送图片,看起来像我认为你会立即明白我的想法 –

+0

给我写一封电子邮件。对我来说会更简单。我会在2天内回答:ajachocki(at)gmail.com –

1

为了让您的代码真正可重用,您应该严格区分显示(视图)和数据。

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

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

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

所以Form1需要知道的是,它是否拥有ICollection<Account>。不知何故,在初始化期间Form1加载Accounts集合。如果操作员按下添加,则会打开一个Form2,他可以填写新帐户所需的值。操作员选择OKCancel来表示他希望将该帐户添加到收藏中(使用窗体中的保存按钮不是Windows标准,并且有点不清楚,因此不要使用它)。

Form2

添加帐户

守则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); 
     } 
    } 
} 

电导率在Visual Studio设计创建形式为ID的文本框和一个文本框输入密码(给它密码属性,所以它显示*****)

添加一个OK和一个取消按钮。为这些按钮的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); 
     } 
    } 
} 

就像在上面的例子中我通常决定具有与插入和提取的帐户而不是访问每单独帐户属性的属性的接口。这允许您更改帐户的内部,而不必改变所有(软件)的用户此帐户的

+0

我觉得不好,你应该花很多时间写这个,我仍然不知道如何使用它/ /我试过,但似乎没有工作,我显然是做错了+我不确定这是我正在尝试做的正确的代码。 这里的GUI图像(应该更容易理解我的想法): [Form1](https://pasteboard.co/GEQFjev.png) [Form2](https://pasteboard.co/GEQG0Fp .png) [Form3](https://pasteboard.co/GEQGaiQ.png) –