Apa versi C # dari InputDialog VB.net?

150

Apa versi C # dari InputBox VB.net?

lebih bijaksana
sumber

Jawaban:

233

Tambahkan referensi ke Microsoft.VisualBasic, InputBoxada di Microsoft.VisualBasic.Interactionnamespace:

using Microsoft.VisualBasic;
string input = Interaction.InputBox("Prompt", "Title", "Default", x_coordinate, y_coordinate);

Hanya argumen pertama promptyang wajib

Ozgur Ozcitak
sumber
Bagaimana jika saya ingin mendapatkan kata sandi dari pengguna?
hims056
3
@ hims056 InputBoxtidak secara alami mendukung input yang di-mask. Anda harus menggulung formulir input Anda sendiri.
Ozgur Ozcitak
4
Cukup impor using Microsoft.VisualBasicsehingga Anda cukup menulisInteraction.InputBox()
Edward Karak
Bisakah kotak input VB diberi nilai untuk diisi di sana sejak awal? (edit) Nevermind, itulah "default", begitu.
Nyerguds
3
Saya telah mencari ini setidaknya 10 kali. Selalu menghasilkan jawaban ini. Akan tersanjung lagi jika saya bisa. Terima kasih!
C4d
108

Singkatnya:

  • Tidak ada di C # .
  • Anda dapat menggunakan dialog dari Visual Basic dengan menambahkan referensi ke Microsoft.VisualBasic:

    1. Di Solution Explorer klik kanan pada folder Referensi .
    2. Pilih Tambahkan Referensi ...
    3. Di tab .NET (di Visual Studio baru - tab Majelis ) - pilih Microsoft.VisualBasic
    4. Klik OK

Kemudian Anda dapat menggunakan kode yang disebutkan sebelumnya:

string input = Microsoft.VisualBasic.Interaction.InputBox("Prompt", "Title", "Default", 0, 0);
  • Tulis InputBox Anda sendiri.
  • Gunakan milik orang lain .

Yang mengatakan, saya sarankan Anda mempertimbangkan kebutuhan kotak input di tempat pertama. Dialog tidak selalu merupakan cara terbaik untuk melakukan berbagai hal dan kadang-kadang lebih berbahaya daripada kebaikan - tetapi itu tergantung pada situasi tertentu.

Tomas Sedovic
sumber
Anda dapat menggunakan dialog dari C # dengan menambahkan referensi itu juga.
Joel Coehoorn
3
Ya mereka. Tapi menurut saya dalam kebanyakan kasus mereka buruk dalam kode pengiriman.
Tomas Sedovic
+1 untuk tautan yang diposting Tomas. Yang ini lebih baik daripada Virtual Basic InputBox.
Joe.wang
Masih lebih baik daripada menggunakan / subsistem: konsol ... Terkadang Anda hanya perlu sedikit interaksi dengan pengguna, dan kemudian Anda dapat menggunakannya, alih-alih 90% kode Anda digunakan untuk UI.
Nulano
Saya memilih opsi "Gunakan orang lain" dan saya senang dengan hasilnya, dari yang ini: reflectionit.nl/blog/2003/c-inputbox . Alasan saya memilih salah satunya adalah tidak adanya ukuran ukuran / nilai lokasi. Juga menjanjikan, adalah csharp-examples.net/inputbox-class . Kedua yang pertama ini memiliki validasi teks yang dimasukkan. Jawaban yang diterima untuk stackoverflow.com/questions/5427020/... juga terlihat bagus, tetapi tidak termasuk fitur validasi input.
Developer63
106

Pembuatan dinamis kotak dialog. Anda dapat menyesuaikan dengan selera Anda.

Perhatikan tidak ada ketergantungan eksternal di sini kecuali winform

private static DialogResult ShowInputDialog(ref string input)
    {
        System.Drawing.Size size = new System.Drawing.Size(200, 70);
        Form inputBox = new Form();

        inputBox.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
        inputBox.ClientSize = size;
        inputBox.Text = "Name";

        System.Windows.Forms.TextBox textBox = new TextBox();
        textBox.Size = new System.Drawing.Size(size.Width - 10, 23);
        textBox.Location = new System.Drawing.Point(5, 5);
        textBox.Text = input;
        inputBox.Controls.Add(textBox);

        Button okButton = new Button();
        okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
        okButton.Name = "okButton";
        okButton.Size = new System.Drawing.Size(75, 23);
        okButton.Text = "&OK";
        okButton.Location = new System.Drawing.Point(size.Width - 80 - 80, 39);
        inputBox.Controls.Add(okButton);

        Button cancelButton = new Button();
        cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
        cancelButton.Name = "cancelButton";
        cancelButton.Size = new System.Drawing.Size(75, 23);
        cancelButton.Text = "&Cancel";
        cancelButton.Location = new System.Drawing.Point(size.Width - 80, 39);
        inputBox.Controls.Add(cancelButton);

        inputBox.AcceptButton = okButton;
        inputBox.CancelButton = cancelButton; 

        DialogResult result = inputBox.ShowDialog();
        input = textBox.Text;
        return result;
    }

pemakaian

string input="hede";
ShowInputDialog(ref input);
Gorkem
sumber
3
OK, sangat mudah, saya menemukannya: inputBox.AcceptButton = okButton; inputBox.CancelButton = cancelButton;
FIV
1
Kerja! Lebih baik daripada solusi VB. Terima kasih beehorf!
Filipe YaBa Polido
8
inputBox.StartPosition = FormStartPosition.CenterParent; akan memusatkan dialog pada jendela induk.
Andrew Cash
2
+1 untuk menulis kode Anda sendiri dan membagikannya di sini! yang lain terlalu malas untuk melakukannya dan hanya ingin poin gratisan mudah.
Kairan
1
Formulir tidak terlihat saat digunakan dalam pengujian unit, posting ini akan sangat membantu. stackoverflow.com/questions/1218517/…
Ray Cheng
9

Tidak ada. Jika Anda benar-benar ingin menggunakan VB InputBox di C # Anda bisa. Cukup tambahkan referensi ke Microsoft.VisualBasic.dll dan Anda akan menemukannya di sana.

Tapi saya sarankan untuk tidak menggunakannya. Ini IMO jelek dan ketinggalan jaman.

Ryan Farley
sumber
18
Saya pikir kamu terlalu baik. Jauh lebih jelek dan ketinggalan jaman dari itu!
BlackWasp
3
Tidak dapat mengidentifikasi canceldari empty input stringsebenarnya adalah bug IMO.
Joe.wang
6

Anda tidak hanya harus menambahkan Microsoft.VisualBasic ke daftar referensi Anda untuk proyek, tetapi juga Anda harus menyatakan 'menggunakan Microsoft.VisualBasic;' jadi Anda hanya perlu menggunakan 'Interaction.Inputbox ("...")' alih-alih Microsoft.VisualBasic.Interaction.Inputbox

AdamL
sumber
3
Jika Anda hanya menggunakannya sekali, ini menambah kekacauan jika OP memutuskan mereka tidak ingin InputBox lagi. Juga, ini harus menjadi komentar.
BalinKingOfMoria Reinstate CMs
5

Mengembalikan string yang dimasukkan pengguna; string kosong jika mereka menekan Cancel:

    public static String InputBox(String caption, String prompt, String defaultText)
    {
        String localInputText = defaultText;
        if (InputQuery(caption, prompt, ref localInputText))
        {
            return localInputText;
        }
        else
        {
            return "";
        }
    }

Mengembalikan Stringsebagai parameter ref , mengembalikan truejika mereka menekan OK, atau falsejika mereka menekan Cancel:

    public static Boolean InputQuery(String caption, String prompt, ref String value)
    {
        Form form;
        form = new Form();
        form.AutoScaleMode = AutoScaleMode.Font;
        form.Font = SystemFonts.IconTitleFont;

        SizeF dialogUnits;
        dialogUnits = form.AutoScaleDimensions;

        form.FormBorderStyle = FormBorderStyle.FixedDialog;
        form.MinimizeBox = false;
        form.MaximizeBox = false;
        form.Text = caption;

        form.ClientSize = new Size(
                    Toolkit.MulDiv(180, dialogUnits.Width, 4),
                    Toolkit.MulDiv(63, dialogUnits.Height, 8));

        form.StartPosition = FormStartPosition.CenterScreen;

        System.Windows.Forms.Label lblPrompt;
        lblPrompt = new System.Windows.Forms.Label();
        lblPrompt.Parent = form;
        lblPrompt.AutoSize = true;
        lblPrompt.Left = Toolkit.MulDiv(8, dialogUnits.Width, 4);
        lblPrompt.Top = Toolkit.MulDiv(8, dialogUnits.Height, 8);
        lblPrompt.Text = prompt;

        System.Windows.Forms.TextBox edInput;
        edInput = new System.Windows.Forms.TextBox();
        edInput.Parent = form;
        edInput.Left = lblPrompt.Left;
        edInput.Top = Toolkit.MulDiv(19, dialogUnits.Height, 8);
        edInput.Width = Toolkit.MulDiv(164, dialogUnits.Width, 4);
        edInput.Text = value;
        edInput.SelectAll();


        int buttonTop = Toolkit.MulDiv(41, dialogUnits.Height, 8);
        //Command buttons should be 50x14 dlus
        Size buttonSize = Toolkit.ScaleSize(new Size(50, 14), dialogUnits.Width / 4, dialogUnits.Height / 8);

        System.Windows.Forms.Button bbOk = new System.Windows.Forms.Button();
        bbOk.Parent = form;
        bbOk.Text = "OK";
        bbOk.DialogResult = DialogResult.OK;
        form.AcceptButton = bbOk;
        bbOk.Location = new Point(Toolkit.MulDiv(38, dialogUnits.Width, 4), buttonTop);
        bbOk.Size = buttonSize;

        System.Windows.Forms.Button bbCancel = new System.Windows.Forms.Button();
        bbCancel.Parent = form;
        bbCancel.Text = "Cancel";
        bbCancel.DialogResult = DialogResult.Cancel;
        form.CancelButton = bbCancel;
        bbCancel.Location = new Point(Toolkit.MulDiv(92, dialogUnits.Width, 4), buttonTop);
        bbCancel.Size = buttonSize;

        if (form.ShowDialog() == DialogResult.OK)
        {
            value = edInput.Text;
            return true;
        }
        else
        {
            return false;
        }
    }

    /// <summary>
    /// Multiplies two 32-bit values and then divides the 64-bit result by a 
    /// third 32-bit value. The final result is rounded to the nearest integer.
    /// </summary>
    public static int MulDiv(int nNumber, int nNumerator, int nDenominator)
    {
        return (int)Math.Round((float)nNumber * nNumerator / nDenominator);
    }

Catatan : Kode apa pun dirilis ke domain publik. Tidak diperlukan atribusi.

Ian Boyd
sumber
public static int MulDiv (int number, int numerator, int denominator) {return (int) ((long) number * numerator + (denominator >> 1)) / denominator); }
Peter Kalef 'DidiSoft
Apa Toolkit?
Markus L
1
@markusL Toolkit adalah kelas saya yang memiliki implementasi MulDiv. Anda dapat melihat komentar Peter sebagai contoh implementasi dari MulDiv.
Ian Boyd
4

Tambahkan referensi ke Microsoft.VisualBasicdan gunakan fungsi ini:

string response =  Microsoft.VisualBasic.Interaction.InputBox("What's 1+1?", "Title", "2", 0, 0);

2 angka terakhir adalah posisi X / Y untuk menampilkan dialog input.

chakrit
sumber
3

Maksud Anda InputBox? Lihat saja di namespace Microsoft. Visual.

C # dan VB.Net berbagi perpustakaan umum. Jika satu bahasa dapat menggunakannya, begitu juga yang lain.

Joel Coehoorn
sumber
2

Tanpa menambahkan referensi ke Microsoft.VisualBasic:

// "dynamic" requires reference to Microsoft.CSharp
Type tScriptControl = Type.GetTypeFromProgID("ScriptControl");
dynamic oSC = Activator.CreateInstance(tScriptControl);

oSC.Language = "VBScript";
string sFunc = @"Function InBox(prompt, title, default) 
InBox = InputBox(prompt, title, default)    
End Function
";
oSC.AddCode(sFunc);
dynamic Ret = oSC.Run("InBox", "メッセージ", "タイトル", "初期値");

Lihat ini untuk informasi lebih lanjut:
ScriptControl
MsgBox di Input JScript
dan MsgBox di JScript

.NET 2.0:

string sFunc = @"Function InBox(prompt, title, default) 
InBox = InputBox(prompt, title, default)    
End Function
";

Type tScriptControl = Type.GetTypeFromProgID("ScriptControl");
object oSC = Activator.CreateInstance(tScriptControl);

// https://github.com/mono/mono/blob/master/mcs/class/corlib/System/MonoType.cs
// System.Reflection.PropertyInfo pi = tScriptControl.GetProperty("Language", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.CreateInstance| System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.IgnoreCase);
// pi.SetValue(oSC, "VBScript", null);

tScriptControl.InvokeMember("Language", System.Reflection.BindingFlags.SetProperty, null, oSC, new object[] { "VBScript" });
tScriptControl.InvokeMember("AddCode", System.Reflection.BindingFlags.InvokeMethod, null, oSC, new object[] { sFunc });
object ret = tScriptControl.InvokeMember("Run", System.Reflection.BindingFlags.InvokeMethod, null, oSC, new object[] { "InBox", "メッセージ", "タイトル", "初期値" });
Console.WriteLine(ret);
Stefan Steiger
sumber
2

Saya dapat mencapai ini dengan mengkode sendiri. Saya tidak suka memperluas dan mengandalkan perpustakaan besar untuk sesuatu yang rudimental.

Bentuk dan Desainer:

public partial class InputBox 
    : Form
{

    public String Input
    {
        get { return textInput.Text; }
    }

    public InputBox()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        DialogResult = System.Windows.Forms.DialogResult.OK;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DialogResult = System.Windows.Forms.DialogResult.Cancel;
    }

    private void InputBox_Load(object sender, EventArgs e)
    {
        this.ActiveControl = textInput;
    }

    public static DialogResult Show(String title, String message, String inputTitle, out String inputValue)
    {
        InputBox inputBox = null;
        DialogResult results = DialogResult.None;

        using (inputBox = new InputBox() { Text = title })
        {
            inputBox.labelMessage.Text = message;
            inputBox.splitContainer2.SplitterDistance = inputBox.labelMessage.Width;
            inputBox.labelInput.Text = inputTitle;
            inputBox.splitContainer1.SplitterDistance = inputBox.labelInput.Width;
            inputBox.Size = new Size(
                inputBox.Width,
                8 + inputBox.labelMessage.Height + inputBox.splitContainer2.SplitterWidth + inputBox.splitContainer1.Height + 8 + inputBox.button2.Height + 12 + (50));
            results = inputBox.ShowDialog();
            inputValue = inputBox.Input;
        }

        return results;
    }

    void labelInput_TextChanged(object sender, System.EventArgs e)
    {
    }

}

partial class InputBox
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.labelMessage = new System.Windows.Forms.Label();
        this.button1 = new System.Windows.Forms.Button();
        this.button2 = new System.Windows.Forms.Button();
        this.labelInput = new System.Windows.Forms.Label();
        this.textInput = new System.Windows.Forms.TextBox();
        this.splitContainer1 = new System.Windows.Forms.SplitContainer();
        this.splitContainer2 = new System.Windows.Forms.SplitContainer();
        ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
        this.splitContainer1.Panel1.SuspendLayout();
        this.splitContainer1.Panel2.SuspendLayout();
        this.splitContainer1.SuspendLayout();
        ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
        this.splitContainer2.Panel1.SuspendLayout();
        this.splitContainer2.Panel2.SuspendLayout();
        this.splitContainer2.SuspendLayout();
        this.SuspendLayout();
        // 
        // labelMessage
        // 
        this.labelMessage.AutoSize = true;
        this.labelMessage.Location = new System.Drawing.Point(3, 0);
        this.labelMessage.MaximumSize = new System.Drawing.Size(379, 0);
        this.labelMessage.Name = "labelMessage";
        this.labelMessage.Size = new System.Drawing.Size(50, 13);
        this.labelMessage.TabIndex = 99;
        this.labelMessage.Text = "Message";
        // 
        // button1
        // 
        this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
        this.button1.Location = new System.Drawing.Point(316, 126);
        this.button1.Name = "button1";
        this.button1.Size = new System.Drawing.Size(75, 23);
        this.button1.TabIndex = 3;
        this.button1.Text = "Cancel";
        this.button1.UseVisualStyleBackColor = true;
        this.button1.Click += new System.EventHandler(this.button1_Click);
        // 
        // button2
        // 
        this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
        this.button2.Location = new System.Drawing.Point(235, 126);
        this.button2.Name = "button2";
        this.button2.Size = new System.Drawing.Size(75, 23);
        this.button2.TabIndex = 2;
        this.button2.Text = "OK";
        this.button2.UseVisualStyleBackColor = true;
        this.button2.Click += new System.EventHandler(this.button2_Click);
        // 
        // labelInput
        // 
        this.labelInput.AutoSize = true;
        this.labelInput.Location = new System.Drawing.Point(3, 6);
        this.labelInput.Name = "labelInput";
        this.labelInput.Size = new System.Drawing.Size(31, 13);
        this.labelInput.TabIndex = 99;
        this.labelInput.Text = "Input";
        this.labelInput.TextChanged += new System.EventHandler(this.labelInput_TextChanged);
        // 
        // textInput
        // 
        this.textInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
        this.textInput.Location = new System.Drawing.Point(3, 3);
        this.textInput.Name = "textInput";
        this.textInput.Size = new System.Drawing.Size(243, 20);
        this.textInput.TabIndex = 1;
        // 
        // splitContainer1
        // 
        this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
        this.splitContainer1.IsSplitterFixed = true;
        this.splitContainer1.Location = new System.Drawing.Point(0, 0);
        this.splitContainer1.Name = "splitContainer1";
        // 
        // splitContainer1.Panel1
        // 
        this.splitContainer1.Panel1.Controls.Add(this.labelInput);
        // 
        // splitContainer1.Panel2
        // 
        this.splitContainer1.Panel2.Controls.Add(this.textInput);
        this.splitContainer1.Size = new System.Drawing.Size(379, 50);
        this.splitContainer1.SplitterDistance = 126;
        this.splitContainer1.TabIndex = 99;
        // 
        // splitContainer2
        // 
        this.splitContainer2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
        | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
        this.splitContainer2.IsSplitterFixed = true;
        this.splitContainer2.Location = new System.Drawing.Point(12, 12);
        this.splitContainer2.Name = "splitContainer2";
        this.splitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal;
        // 
        // splitContainer2.Panel1
        // 
        this.splitContainer2.Panel1.Controls.Add(this.labelMessage);
        // 
        // splitContainer2.Panel2
        // 
        this.splitContainer2.Panel2.Controls.Add(this.splitContainer1);
        this.splitContainer2.Size = new System.Drawing.Size(379, 108);
        this.splitContainer2.SplitterDistance = 54;
        this.splitContainer2.TabIndex = 99;
        // 
        // InputBox
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(403, 161);
        this.Controls.Add(this.splitContainer2);
        this.Controls.Add(this.button2);
        this.Controls.Add(this.button1);
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
        this.MaximizeBox = false;
        this.MinimizeBox = false;
        this.Name = "InputBox";
        this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
        this.Text = "Title";
        this.TopMost = true;
        this.Load += new System.EventHandler(this.InputBox_Load);
        this.splitContainer1.Panel1.ResumeLayout(false);
        this.splitContainer1.Panel1.PerformLayout();
        this.splitContainer1.Panel2.ResumeLayout(false);
        this.splitContainer1.Panel2.PerformLayout();
        ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
        this.splitContainer1.ResumeLayout(false);
        this.splitContainer2.Panel1.ResumeLayout(false);
        this.splitContainer2.Panel1.PerformLayout();
        this.splitContainer2.Panel2.ResumeLayout(false);
        ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
        this.splitContainer2.ResumeLayout(false);
        this.ResumeLayout(false);

    }

    #endregion

    private System.Windows.Forms.Label labelMessage;
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.Button button2;
    private System.Windows.Forms.Label labelInput;
    private System.Windows.Forms.TextBox textInput;
    private System.Windows.Forms.SplitContainer splitContainer1;
    private System.Windows.Forms.SplitContainer splitContainer2;
}

Pemakaian:

String output = "";

result = System.Windows.Forms.DialogResult.None;

result = InputBox.Show(
    "Input Required",
    "Please enter the value (if available) below.",
    "Value",
    out output);

if (result != System.Windows.Forms.DialogResult.OK)
{
    return;
}

Perhatikan ini menunjukkan sedikit ukuran otomatis agar tetap cantik berdasarkan pada seberapa banyak teks yang Anda tanyakan ditampilkan. Saya juga tahu itu tidak memiliki lonceng dan peluit tetapi ini merupakan langkah maju yang solid bagi mereka yang menghadapi dilema yang sama.

David Carrigan
sumber
-2

Tidak ada hal seperti itu: Saya sarankan untuk menulisnya sendiri dan menggunakannya kapan pun Anda butuhkan.

MADMap
sumber