C# 将表单作为参数发送并将参数发送给它
我一直在寻找一种方法,将表单作为参数发送并为其提供变量,现在我这样做:C# 将表单作为参数发送并将参数发送给它,c#,winforms,C#,Winforms,我一直在寻找一种方法,将表单作为参数发送并为其提供变量,现在我这样做: private void ToolStripMenuItem_Click(object sender, EventArgs e) { Form form = new Form(); form.user = user; form.loginID = loginID; form.loginInfo = loginInfo; form.Text = "Title" + login
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
Form form = new Form();
form.user = user;
form.loginID = loginID;
form.loginInfo = loginInfo;
form.Text = "Title" + loginInfo;
form.Show();
}
我有很多相同代码的菜单,我一直在寻找类似这样的东西来减少代码:
private void ToolStripMenuItem1_Click(object sender, EventArgs e)
{
Form form = new Form();
FormsMenu(form);
}
private void FormsMenu(Form form)
{
form.user = user;
form.loginID = loginID;
form.loginInfo = loginInfo;
form.Text = "Title" + loginInfo;
form.Show();
}
但是我在分配变量时出错:
消息错误是:CS1061“Form”不包含“Usariosistema”的定义,并且找不到接受“Form”类型的第一个参数的扩展方法“Usariosistema”(您是否缺少using指令或程序集引用?)。是ToolStripMenuItem\u Click()中的Form是您自己的类型(Form1
例如)?它甚至不应该按原样编译。FormsMenu()
有一个类型为Form
的参数,它是自定义表单的基类
据我所知,表单
(基类)没有声明要在表单菜单()
中分配的变量。因此它没有编译
我猜你只是打字错误,你想写:
void FormsMenu(Form1 form)
编辑:
如果您试图找到一个通用的解决方案来设置不同的(多种类型的)自定义表单,那么您的问题对这一点的描述(甚至没有描述)非常糟糕。此外,不可编译的代码会误导您,但下面是您的答案
1.:您需要一个描述自定义参数的接口,以及其他一些表单参数:
2.:您需要将表单收缩到此接口,该接口还确保实现属性
partial class FormA : Form, IUsuairoSistemaCompatibleForm
partial class FormB : Form, IUsuairoSistemaCompatibleForm
3.:然后您可以构建所需的、通用的、自定义的、松散耦合的表单初始值设定项:
void FormsMenu(IUsuairoSistemaCompatibleForm form) //note it was heavily coupled by the type "Form" so your properties failed to be recognized
{
form.user = user; //compiler will see now that your custom forms has these properties
form.loginID = loginID;
form.loginInfo = loginInfo;
form.Text = "Title" + loginInfo;
form.Show();
}
4.:现在您的代码将按如下方式工作:
private void ToolStripMenuItem1_Click(object sender, EventArgs e)
=> FormsMenu(new FormA());
private void ToolStripMenuItem2_Click(object sender, EventArgs e)
=> FormsMenu(new FormB());
(相当于:)
p、 s:
在上面的第3点中,如果需要,可以使用泛型:
void FormsMenu<T>(T form) where T: IUsuairoSistemaCompatibleForm
{
form.user = user;
form.loginID = loginID;
form.loginInfo = loginInfo;
form.Text = "Title" + loginInfo;
form.Show();
}
无效表单菜单(T表单),其中T:IUsuairoSistemaCompatibleForm
{
form.user=用户;
form.loginID=loginID;
form.loginInfo=loginInfo;
form.Text=“Title”+登录信息;
form.Show();
}
为什么不更改表单的构造函数,使其接受这些参数(用户、loginId等),然后将它们分配给自身
public Form(User user, int loginId, string loginInfo)
{
this.user = user;
this.loginId = loginId;
this.loginInfo = loginInfo;
this.Text = $"Title {loginInfo}";
}
然后更改您的功能:
private void ToolStripMenuItem1_Click(object sender, EventArgs e)
{
FormsMenu(user, loginId, loginInfo);
}
private void FormsMenu(User user, int loginId, string loginInfo)
{
var form = new Form(user, loginId, loginInfo);
form.Show();
}
这些字段可能是只读字段,这意味着您无法为其赋值them@Dumisani在这种情况下,它在单击事件中也不起作用。您能否以可读的形式(例如:不作为图像)共享完整而准确的错误消息?对我来说,这听起来像是一个典型的XY问题。与其将user、loginID、loginInfo
传递给WinForms项目中的每个表单,只需创建一个类对象来保存这些值,将全局变量实例化为该类类型,在身份验证/授权后对其进行初始化,并在表单中引用它。是的,我说过global变量…当前登录的用户可以使用全局变量IMHO.:)我仍然认为您缺少表单的含义:您的表单都不是表单类型。您可以将其测试为form.GetType()==ofType(form)
。那么,您如何期望编译器知道它是FormA或FormB,而FormA或FormB具有loginID、loginInfo和您的其他属性。你应该检查我的答案。如果您试图为表单实现通用解决方案,那么您的问题对这一点的描述(甚至没有描述)非常糟糕。但我会编辑我的答案,为这个案例提供信息。我只是在尝试,但我认为它实际上不会减少代码,因为我会在每个表单中放置相同的行。什么相同的行?就像你说的,我必须更改构造函数,但对于每个表单,并添加:public form(用户用户,int-loginId,string-loginInfo){this.user=user;this.loginId=loginId;this.loginInfo=loginInfo;this.Text=$“Title{loginInfo}”}你在说什么?你的表单是一个类。你只需要更改一次。
public Form(User user, int loginId, string loginInfo)
{
this.user = user;
this.loginId = loginId;
this.loginInfo = loginInfo;
this.Text = $"Title {loginInfo}";
}
private void ToolStripMenuItem1_Click(object sender, EventArgs e)
{
FormsMenu(user, loginId, loginInfo);
}
private void FormsMenu(User user, int loginId, string loginInfo)
{
var form = new Form(user, loginId, loginInfo);
form.Show();
}