【问题标题】:How to return values, entered by the user in a welcome screen, to the main screen after closed? [duplicate]关闭后如何将用户在欢迎屏幕中输入的值返回到主屏幕? [复制]
【发布时间】:2020-07-06 13:16:45
【问题描述】:

Previous Post

根据我之前的帖子。我让它正常工作。

在欢迎屏幕中,用户输入他/她的详细信息。比如名字和姓氏。然后用户单击下一步按钮。欢迎屏幕关闭,主窗口打开。

但是,在 main.cs 文件中无法再访问姓名和姓氏。

欢迎屏幕代码:

    public string username;
    public string usersurname;

    static private Form Sender;

    static public void Run(Form sender)
    {
        if (sender == null)
            throw new ArgumentNullException();

        Sender = sender;
        new WelcomeForm().ShowDialog();
    }
   
    public WelcomeForm()
    {
        InitializeComponent();
    }

    private void sign_in_Click(object sender, EventArgs e)
    {   
        username = textBox1.Text;
        usersurname = textBox2.Text;
        Close();
    }

我的主窗口代码:

    private void Form1_Load(object sender, EventArgs e)
    {
        WelcomeForm.Run(this);
    }

    public Form1()
    {
        InitializeComponent();
    }

如何在我的 main.cs 文件中访问用户名和用户名?

更新代码(欢迎屏幕):

    private WelcomeFormInputData InputData = new WelcomeFormInputData();

    static private Form Sender;

    static public WelcomeFormInputData Run(Form sender)
    {
        if (sender == null)
            throw new ArgumentNullException();
        Sender = sender;
        var form = new WelcomeForm();
        return form.ShowDialog() == DialogResult.OK ? form.InputData : null;
    }

    private void ButtonValidate_Click(object sender, EventArgs e)
    {
        InputData.UserName = textBox1.Text;
        InputData.UserSurname = textBox2.Text;
        DialogResult = DialogResult.OK;
        Close();
    }
    public WelcomeForm()
    {
        InitializeComponent();
    }
public class WelcomeFormInputData
{
  public string UserName { get; set; }
  public string UserSurname { get; set; }
}

【问题讨论】:

  • 在欢迎屏幕代码中有一个Run 方法来执行创建/显示,这将使访问它们变得更加困难,因为它会隐藏您创建的实例。如果您的主窗口改为使用new WelcomeForm().. 部分,则可以通过创建的实例访问公共变量。关于这类事情,这里有很多问题。
  • 这能回答你的问题吗? Send values from one form to another form
  • 这个问题可以作为重复问题删除吗?我已经尝试过该帖子中提到的代码,但它没有回答我的问题。

标签: c# winforms user-input user-experience


【解决方案1】:

您可以简单地将Run 方法改进为:

static public WelcomeForm Run(Form sender)
{
    if (sender == null)
        throw new ArgumentNullException();
    Sender = sender;
    var form = new WelcomeForm();
    return form.ShowDialog() == DialogResult.OK ? form : null;
}

您需要使用按钮管理此对话框结果:

private void ButtonValidate_Click(object sender, EventArgs e)
{
  UserName = textBox1.Text;
  UserSurname = textBox2.Text;
  DialogResult = DialogResult.OK;
  Close();
}

每个表单都有一些属性来管理它:

https://docs.microsoft.com/dotnet/api/system.windows.forms.form.dialogresult

默认情况下,关闭表单时结果为DialogResult.None

非空结果表示用户已经验证了某些内容,并且开启者表单可以像您一样通过分配您应该设置为外部只读属性的公共字段来使用结果:

public string UserName { get; private set; }
public string UserSurname { get; private set; }

另一种意思是返回结构化数据实体而不是表单本身:

public class WelcomeFormInputData
{
  public string UserName { get; set; }
  public string UserSurname { get; set; }
}

所以您可以在欢迎表单中更改它:

private WelcomeFormInputData InputData = new WelcomeFormInputData();

static public WelcomeFormInputData Run(Form sender)
{
    if (sender == null)
        throw new ArgumentNullException();
    Sender = sender;
    var form = new WelcomeForm();
    return form.ShowDialog() == DialogResult.OK ? form.InputData : null;
}

private void ButtonValidate_Click(object sender, EventArgs e)
{
  InputData.UserName = textBox1.Text;
  InputData.UserSurname = textBox2.Text;
  DialogResult = DialogResult.OK;
  Close();
}

这里我们只返回经过验证的数据。

您可以根据需要将工件命名为最有意义、最简单和最连贯的。

注意:如果需要控制 MainForm 特化,可以通过 MainForm 更改 Form。

static public WelcomeForm Run(MainForm sender)

但也许你可以抛弃 Sender 用法,因为在主窗体中你调用 Run 然后你可以显示它并使用输入的数据:

static public WelcomeFormInputData Run()
{
    var form = new WelcomeForm();
    return form.ShowDialog() == DialogResult.OK ? form.InputData : null;
}

而从主窗体:

var userdata = WelcomeForm.Run();
Show();
if ( userdata != null ) 
{
  ... userdata.UserName ...
  ... userdata.UserSurname ...
}

【讨论】:

  • ModalResult 出现错误。 “该名称不存在其当前形式”
  • 是的,它的DialogResult...答案已更新。德尔福自动化:)
  • 我更新了你的问题。如果您使用WelcomeFormInputData,它将替换字段用户名和用户名,因此您可以获得更好的设计和干净的代码。也许您可以抛弃Sender 的用法,因为在主窗体中您调用Run,接下来可以显示它并使用输入的数据。
  • 谢谢。在主窗体中,您可以使用userdata.UserNameuserdata.UserSurname。我希望这可以帮助你:How do I improve my knowledge in C#
  • 会的!但是您的虚拟课程要好得多!
【解决方案2】:

您可以使用 WelcomeForm.username 之类的方法,并且可以创建名为 LocalVar 的类来访问和存储任何形式的任何数据,例如

in `LocalVar` class use this type of variables:

`public static string username = "";`
`public static string usersurname = "";`

在此之后,在您关闭 WelcomeForm 之前执行如下代码:

private void sign_in_Click(object sender, EventArgs e)
{   
    LocalVar.username = textBox1.Text;
    LocalVar.usersurname = textBox2.Text;
    Close();
}    



and now you can usr `LocalVar.username` anywhere in project.

【讨论】:

  • 类名为LocalVar?诚实地?真的不好回答。不仅格式错误,而且将所有内容都设为static 也是一种不好的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多