C#如何从表单返回结果

C#如何从表单返回结果,c#,winforms,visual-studio,C#,Winforms,Visual Studio,我正在编写一个自定义的输入框,因为我不想使用VB框。因此,我希望表单在关闭时返回框的结果 我在表单的代码中添加了一个重载: public InputBox() { InitializeComponent(); } public string InputBox(string LabelText, string Title, string DefaultResult) { return DefaultResult; } 这是一个好方法还是我应该或者可以修改构造函数?谢谢。就我个人

我正在编写一个自定义的
输入框
,因为我不想使用VB框。因此,我希望表单在关闭时返回框的结果

我在表单的代码中添加了一个重载:

public InputBox()
{
    InitializeComponent();
}

public string InputBox(string LabelText, string Title, string DefaultResult)
{
    return DefaultResult;
}

这是一个好方法还是我应该或者可以修改构造函数?谢谢。

就我个人而言,对于这些典型的模态“实用”形式,我更喜欢走
静态
路线,让构造函数私有化。比如:

private InputBox() // Constructor is private
{
    InitializeComponent();
}

public static string GetValue(string LabelText, string Title, string DefaultResult)
{
    using(var form = new InputBox())
    {
       form.myLabel.Text = labelText;
       form.Text = Title;
       form.myTextBox.Text = DefaultResult;
       if(form.ShowDialog() == DialogResult.OK)
         return form.myTextBox.Text;
    }
    return DefaultResult;
}
然后像这样使用它:

string myValue = InputBox.GetValue("foo","bar","baz");

根据评论中的要求,这里有一些其他的方法来实现这一点,而不使用
静态
方法。。。基本上是一样的,但是您将表单的处理交给了调用者:

string myValue = "baz";
using(var form = new InputBox("foo", "bar", myValue))
{
   form.ShowDialog();
   myValue = form.GetValue();       
}
在您的
输入框中
类:

private string _defaultResult;

public InputBox(string LabelText, string Title, string DefaultResult)
{
    InitializeComponent();
    myLabel.Text = LabelText;
    Text = Title;
    _defaultResult = myTextBox.Text = DefaultResult;
}

public string GetValue()
{
    return this.DialogResult == DialogResult.OK ? myTextBox.Text : _defaultResult;
}
至于来电者:

string myValue = "baz";
using(var form = new InputBox("foo", "bar", myValue))
{
   form.ShowDialog();
   myValue = form.GetValue();       
}
请注意,我不鼓励使用这种方法,因为使用这种表单的唯一合理的方法很可能是模态对话框,这可能会让类的用户感到困惑


使用简单的静态方法(使用私有构造函数,因此调用方不能以任何其他方式实例化表单)对此更有意义,因为它不会强迫调用方知道表单的设计用途:只有一种可能的使用方法。

就我个人而言,对于这些典型的模态“实用”表单,我更喜欢使用
static
路线,让构造函数是私有的。比如:

private InputBox() // Constructor is private
{
    InitializeComponent();
}

public static string GetValue(string LabelText, string Title, string DefaultResult)
{
    using(var form = new InputBox())
    {
       form.myLabel.Text = labelText;
       form.Text = Title;
       form.myTextBox.Text = DefaultResult;
       if(form.ShowDialog() == DialogResult.OK)
         return form.myTextBox.Text;
    }
    return DefaultResult;
}
然后像这样使用它:

string myValue = InputBox.GetValue("foo","bar","baz");

根据评论中的要求,这里有一些其他的方法来实现这一点,而不使用
静态
方法。。。基本上是一样的,但是您将表单的处理交给了调用者:

string myValue = "baz";
using(var form = new InputBox("foo", "bar", myValue))
{
   form.ShowDialog();
   myValue = form.GetValue();       
}
在您的
输入框中
类:

private string _defaultResult;

public InputBox(string LabelText, string Title, string DefaultResult)
{
    InitializeComponent();
    myLabel.Text = LabelText;
    Text = Title;
    _defaultResult = myTextBox.Text = DefaultResult;
}

public string GetValue()
{
    return this.DialogResult == DialogResult.OK ? myTextBox.Text : _defaultResult;
}
至于来电者:

string myValue = "baz";
using(var form = new InputBox("foo", "bar", myValue))
{
   form.ShowDialog();
   myValue = form.GetValue();       
}
请注意,我不鼓励使用这种方法,因为使用这种表单的唯一合理的方法很可能是模态对话框,这可能会让类的用户感到困惑


使用简单的静态方法(带有私有构造函数,因此调用方不能以任何其他方式实例化表单)更有意义,因为它不会强迫调用方知道表单的设计用途:只有一种可能的使用方法。

这看起来很棒!如果我重载
输入框
,结果会不一样吗?或者你不能重载这样的?定义
“重载输入框”
,我不明白你的意思。如果你的意思是调用你的方法
InputBox
,如果你的类名是
InputBox
,你就不能这么做。。。试试看:它会给出一个编译错误(问题中的示例代码不会编译,因为你不能从构造函数返回,也不能命名其他方法,比如它们所属的类),即使你可以(你不能),这可能是一件非常糟糕的事。。。假设您将
InputBox
静态方法放在
InputBox.InputBox
命名空间中的
InputBox
类上:您可能需要像
var myValue=InputBox.InputBox.InputBox.InputBox(“foo”、“bar”、“baz”)那样调用它哪一个更有可能成为解雇在任何一家体面公司制造代码的人的原因:-)啊哈,这正是我的问题。所以,除了使用你说的静态方法之外,没有其他方法了。好的,谢谢你的澄清,这对我来说很有意义。我确实接受了你的答案,并投了赞成票,因为它不仅解决了问题,而且很有启发性。这看起来很棒!如果我重载
输入框
,结果会不一样吗?或者你不能重载这样的?定义
“重载输入框”
,我不明白你的意思。如果你的意思是调用你的方法
InputBox
,如果你的类名是
InputBox
,你就不能这么做。。。试试看:它会给出一个编译错误(问题中的示例代码不会编译,因为你不能从构造函数返回,也不能命名其他方法,比如它们所属的类),即使你可以(你不能),这可能是一件非常糟糕的事。。。假设您将
InputBox
静态方法放在
InputBox.InputBox
命名空间中的
InputBox
类上:您可能需要像
var myValue=InputBox.InputBox.InputBox.InputBox(“foo”、“bar”、“baz”)那样调用它哪一个更有可能成为解雇在任何一家体面公司制造代码的人的原因:-)啊哈,这正是我的问题。所以,除了使用你说的静态方法之外,没有其他方法了。好的,谢谢你的澄清,这对我来说很有意义。我确实接受了你的答案,并投了赞成票,因为它不仅解决了问题,而且很有启发性。