C# 如何仅在以下情况下返回值;“好的”;点击

C# 如何仅在以下情况下返回值;“好的”;点击,c#,winforms,prompt,C#,Winforms,Prompt,我已经创建了一个custimazibale提示符 public static class Prompt { public static string ShowDialog(int columnnumber, string columnname) { Form prompt = new Form(); prompt.Width = 500; prompt.Height = 150; prompt.FormBorderS

我已经创建了一个custimazibale提示符

public static class Prompt
{
    public static string ShowDialog(int columnnumber, string columnname)
    {
        Form prompt = new Form();
        prompt.Width = 500;
        prompt.Height = 150;
        prompt.FormBorderStyle = FormBorderStyle.FixedDialog;
        prompt.Text = columnname;
        prompt.StartPosition = FormStartPosition.CenterScreen;
        Label textLabel = new Label() { Left = 50, Top = 20 };
        ComboBox comboBox = new ComboBox() { Left = 50, Top = 50, Width = 400 };
        comboBox.Items.AddRange(new string[] { "a","b","c" });
        comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
        comboBox.SelectedItem = columnname;
        Button confirmation = new Button() { Text = "Ok", Left = 350, Width = 100, Top = 80 };
        confirmation.Click += (sender, e) => { prompt.Close(); };
        textLabel.Text = "Colonne " + (columnnumber + 1).ToString() + " : " + columnname;
        prompt.Controls.Add(comboBox);
        prompt.Controls.Add(confirmation);
        prompt.Controls.Add(textLabel);
        prompt.AcceptButton = confirmation;
        prompt.ShowDialog();
        prompt.AcceptButton = confirmation;

        return comboBox.Text;
    }
}
然后单击标题时,我在主窗体中调用它

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
     dt.Columns[e.ColumnIndex].ColumnName = Prompt.ShowDialog(e.ColumnIndex, dataGridView1.Columns[e.ColumnIndex].Name);
}
问题是,即使单击“关闭”按钮,我的文本也会更改。
但我希望只有当用户单击“确定”按钮时,它才会更改。

您可以在确认时设置布尔值,如果未确认,则使用该值返回null,如下所示:

public static string ShowDialog(int columnnumber, string columnname)
{
    Form prompt = new Form();
    prompt.Width = 500;
    prompt.Height = 150;
    prompt.FormBorderStyle = FormBorderStyle.FixedDialog;
    prompt.Text = columnname;
    prompt.StartPosition = FormStartPosition.CenterScreen;
    Label textLabel = new Label()
    {
        Left = 50,
        Top = 20
    };
    ComboBox comboBox = new ComboBox()
    {
        Left = 50,
        Top = 50,
        Width = 400
    };
    comboBox.Items.AddRange(new string[] { "a", "b", "c" });
    comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
    comboBox.SelectedItem = columnname;
    Button confirmation = new Button()
    {
        Text = "Ok",
        Left = 350,
        Width = 100,
        Top = 80
    };

    bool confirmed = false;

    confirmation.Click += (sender, e) =>
    {
        prompt.Close();
        confirmed = true;
    };
    textLabel.Text = "Colonne " + (columnnumber + 1).ToString() + " : " + columnname;
    prompt.Controls.Add(comboBox);
    prompt.Controls.Add(confirmation);
    prompt.Controls.Add(textLabel);
    prompt.AcceptButton = confirmation;
    prompt.ShowDialog();
    prompt.AcceptButton = confirmation;

    return confirmed ? comboBox.Text : null;
}
using(Form prompt = new Form())
{
    //Initialize the components of your form

    DialogResult result = prompt.ShowDialog();
    if(result == DialogResult.OK)
    {
       //return whatever it is you want to return
    }
}
您的调用代码将需要检查返回值是否为null,并且仅在返回值不为null时执行操作。

您可以计算返回值,如果返回值不为null,则返回
null

public static class Prompt
{
    public static string ShowDialog(int columnnumber, string columnname)
    {
        using (Form prompt = new Form())
        {
            // other code
            return prompt.DialogResult == DialogResult.OK ? comboBox.Text : null;
        }
    }
}
然后用另一种方法:

private void dataGridView1_ColumnHeaderMouseClick(object sender, EventArgs e)
{
    var result = Prompt.ShowDialog(e.ColumnIndex, 
                                   dataGridView1.Columns[e.ColumnIndex].Name);
    if (result != null)
        dt.Columns[e.ColumnIndex].ColumnName = result;
}
提示符中
应相应地设置
对话框结果

confirmation.Click += (sender, e) =>
    {
        prompt.DialogResult = DialogResult.OK;
        prompt.Close();
    };

提示:而不是
result!=空
您也可以使用
!String.IsNullOrWhiteSpace(result)
仅在输入内容时更新列名。

我会选择以下内容:

public static string ShowDialog(int columnnumber, string columnname)
{
    Form prompt = new Form();
    prompt.Width = 500;
    prompt.Height = 150;
    prompt.FormBorderStyle = FormBorderStyle.FixedDialog;
    prompt.Text = columnname;
    prompt.StartPosition = FormStartPosition.CenterScreen;
    Label textLabel = new Label()
    {
        Left = 50,
        Top = 20
    };
    ComboBox comboBox = new ComboBox()
    {
        Left = 50,
        Top = 50,
        Width = 400
    };
    comboBox.Items.AddRange(new string[] { "a", "b", "c" });
    comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
    comboBox.SelectedItem = columnname;
    Button confirmation = new Button()
    {
        Text = "Ok",
        Left = 350,
        Width = 100,
        Top = 80
    };

    bool confirmed = false;

    confirmation.Click += (sender, e) =>
    {
        prompt.Close();
        confirmed = true;
    };
    textLabel.Text = "Colonne " + (columnnumber + 1).ToString() + " : " + columnname;
    prompt.Controls.Add(comboBox);
    prompt.Controls.Add(confirmation);
    prompt.Controls.Add(textLabel);
    prompt.AcceptButton = confirmation;
    prompt.ShowDialog();
    prompt.AcceptButton = confirmation;

    return confirmed ? comboBox.Text : null;
}
using(Form prompt = new Form())
{
    //Initialize the components of your form

    DialogResult result = prompt.ShowDialog();
    if(result == DialogResult.OK)
    {
       //return whatever it is you want to return
    }
}

在表单中,您可以通过
prompt.DialogResult=DialogResult.OK
和其他一些选项(DialogResult.Cancel、DialogResult.Retry等)设置DialogResult

这可能比根据我的答案设置局部变量要好。一旦设置了DialogResult,表单就会隐藏,但是,如果表单位于使用对话框的内部,则在您处理完DialogResult后,如果我没有弄错的话,它将被处理。@meansomerandoms:True,只要您使用
ShowDialog
。使用
Show
(这里不是这种情况)只会设置属性。此外,表单仅被隐藏,并且在这种情况下,
Close
不会自动调用,因此,如果有人正在侦听关闭事件,则会使用“手动调用”…我最后使用了此解决方案,这样更好。非常感谢。