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