我对C#很陌生,在制作我的第一个程序时我遇到了问题。
所以我有3个窗口(MyForm1; MyForm2 and MyForm3)
MyForm1
有2个按钮(可用帐户和添加新帐户)
当我单击其中一个按钮时,它会打开一个新的窗体。
在添加新帐户表单中,我有2 TextBox
(1为ID,1为PWD +按钮(保存),我希望用户输入他的ID和PWD并保存,所以我可以在可用帐户表格中重复使用它,但我不知道如何做到这一点。我尝试了我在YT上看到的不同的东西,但似乎没有任何东西像我一样
感谢您的帮助< 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
,他可以在其中填写新帐户所需的值。操作员选择OK
或Cancel
表示他希望将此帐户添加到集合中(使用表单中的“保存”按钮不是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
在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)
关于在表单之间传递数据,所以你可以使用以下方法之一:
在公共字符串中设置用户输入,以便您可以通过输入表单对象访问其他表单中的字符串。
您可以将用户输入作为构造函数参数传递,然后使用表单中的数据。
还有其他多种方式,例如委托,但我认为之前的两种方式很简单。