Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从两个或多个表单C获取值#_C#_Sql_Winforms_Connect - Fatal编程技术网

C# 从两个或多个表单C获取值#

C# 从两个或多个表单C获取值#,c#,sql,winforms,connect,C#,Sql,Winforms,Connect,好的,用户成功登录后,alertbox将显示用户名,然后会弹出另一个表单,允许用户更改密码。我想在条件语句中使用用户名(来自登录表单)的值来更改密码 我如何从另一种形式得到这个值?谢谢 在此处查看图像:什么让你困惑? 将用户名传递给下一个表单,我不明白为什么第三个表单需要知道其他任何信息。这将是另一个无用的依赖项。您可以创建一个将在成功登录时引发的,您可以使用传递信息,然后在启动第二个表单时使用它 大概是这样的: 表格1 public partial class Form1 : Form {

好的,用户成功登录后,alertbox将显示用户名,然后会弹出另一个表单,允许用户更改密码。我想在条件语句中使用用户名(来自登录表单)的值来更改密码

我如何从另一种形式得到这个值?谢谢

在此处查看图像:

什么让你困惑? 将用户名传递给下一个表单,我不明白为什么第三个表单需要知道其他任何信息。这将是另一个无用的依赖项。

您可以创建一个将在成功登录时引发的,您可以使用传递信息,然后在启动第二个表单时使用它

大概是这样的:

表格1

public partial class Form1 : Form
{

    Logon logon;
    PasswordChange pass;

    public Form1()
    {
        InitializeComponent();

        logon = new Logon();
        logon.raiseLoginEvent += new Logon.LoginSuccesful(logon_raiseLoginEvent);
        logon.ShowDialog();

    }

    void logon_raiseLoginEvent(object sender, LoginEventArgs e)
    {
        pass = new PasswordChange();
        pass.LoginName = e.Login;
        pass.ShowDialog();
    }


}
登录

public partial class Logon : Form
{
    public delegate void LoginSuccesful(object sender, LoginEventArgs e);
    public event LoginSuccesful raiseLoginEvent;

    public Logon()
    {
        InitializeComponent();
    }


    private void Logon_FormClosing(object sender, FormClosingEventArgs e)
    {
        LoginEventArgs ev = new LoginEventArgs("Admin");
        raiseLoginEvent(this, ev);
    }
}

public class LoginEventArgs : EventArgs
{
    public LoginEventArgs(string s)
    {
        loginName = s;
    }
    private string loginName;
    public string Login
    {
        get { return loginName; }
        set { loginName = value; }
    } 
}
密码更改

public partial class PasswordChange : Form
{
    public PasswordChange()
    {
        InitializeComponent();
    }

    public string LoginName
    {
        get {return  textBox1.Text; }
        set { textBox1.Text = value; }
    }

}

一种方法是在登录表单中使用公共属性作为用户名,您可以在其他表单中访问该用户名

例如:

在LoginForm中,创建一个公共属性

public string UserName { get; private set;}

在LoginForm中填写此属性并将其传递给其他表单。在创建第二个表单的对象时,您可以从第一个表单访问数据,然后将其传递给其他表单的属性/构造函数

比如说,

FacultyForm facultyForm=new FacultyForm();
facultyForm.UserName = loginForm.UserName; //in this case you have to create a property in other form too. 
这只是其中一种方法

这能解决问题吗


另一种方法是使用委托/事件。

公开登录表单的用户名文本框,以便您可以从任何其他表单访问


您可以在LoginForm.designer.cs中更改代码,一种方法是在登录表单中使用公共属性作为用户名,您可以在其他表单中访问该用户名。刚刚发现一篇相对类似的帖子,我如何将其传递给其他表单?在创建第二个表单的对象时,您可以从第一个表单访问数据,然后将其传递给另一个表单的属性/构造函数。例如,FacultyForm FacultyForm=new FacultyForm();facultyForm.UserName=loginForm.UserName//在这种情况下,还必须以其他形式创建属性。这只是其中一种方法。取决于如何显示第三种形式。向我们展示一些内部逻辑。但通常应该是这样的(我想):如果授权成功,您将打开欢迎对话框。比你开三年级好,对吗?在那里创建一个名为UserName的属性(或者使用UserName参数创建一个构造函数)。也许有些细微差别我不知道。让我知道更具体一点我试过这个。它没有任何错误,但没有显示值。为控件设置公共修饰符是不好的做法。这通常意味着您的体系结构中存在问题。正如我所说的,在这种情况下使用属性或构造函数。这是我为你做的一个例子@非常感谢你。两个或两个以上的值也可以传递吗?@canthandlemeba当然,这取决于你的想象。公共控制是一种糟糕的做法。最好避免。顺便说一下,没有理由这么做