Phiên bản C # của InputDialog của VB.net là gì?


Câu trả lời:


233

Thêm một tham chiếu đến Microsoft.VisualBasic, InputBoxlà trong Microsoft.VisualBasic.Interactionkhông gian tên:

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

Chỉ có đối số đầu tiên promptlà bắt buộc


Nếu tôi muốn lấy mật khẩu từ người dùng thì sao?
hims056

3
@ hims056 InputBoxkhông hỗ trợ đầu vào đeo mặt nạ. Bạn sẽ cần phải cuộn mẫu đầu vào của riêng bạn.
Ozgur Ozcitak

4
Chỉ cần nhập using Microsoft.VisualBasicđể bạn chỉ cần viếtInteraction.InputBox()
Edward Karak

Hộp đầu vào VB có thể được cung cấp một giá trị được điền vào đó ngay từ đầu không? (chỉnh sửa) Nevermind, đó là "mặc định", tôi thấy.
Nyerguds

3
Tôi đã tìm kiếm điều này ít nhất 10 lần. Luôn luôn dẫn đến câu trả lời này. Sẽ upvote một lần nữa nếu tôi có thể. Cảm ơn!
C4d

108

Tóm lại:

  • Không có gì trong C # .
  • Bạn có thể sử dụng hộp thoại từ Visual Basic bằng cách thêm một tham chiếu đến Microsoft.VisualBasic:

    1. Trong Solution Explorer , nhấp chuột phải vào thư mục Tài liệu tham khảo .
    2. Chọn Thêm tài liệu tham khảo ...
    3. Trong tab .NET (trong các phiên bản Visual Studio mới hơn - tab hội ) - chọn Microsoft.VisualBasic
    4. Bấm vào OK

Sau đó, bạn có thể sử dụng mã được đề cập trước đó:

string input = Microsoft.VisualBasic.Interaction.InputBox("Prompt", "Title", "Default", 0, 0);
  • Viết InputBox của riêng bạn.
  • Sử dụng của người khác .

Điều đó nói rằng, tôi đề nghị bạn xem xét sự cần thiết của một hộp đầu vào ở nơi đầu tiên. Đối thoại không phải lúc nào cũng là cách tốt nhất để làm mọi việc và đôi khi chúng gây hại nhiều hơn lợi - nhưng điều đó phụ thuộc vào tình huống cụ thể.


Bạn cũng có thể sử dụng hộp thoại từ C # bằng cách thêm tham chiếu đó.
Joel Coehoorn

3
Vâng, họ là. Nhưng dường như trong hầu hết các trường hợp, chúng rất tệ trong mã vận chuyển.
Tomas Sedovic

+1 cho liên kết mà Tomas đã đăng. Cái này tốt hơn so với InputBox ảo cơ bản.
Joe.wang

Vẫn tốt hơn so với sử dụng / hệ thống con: bảng điều khiển ... Đôi khi bạn chỉ cần rất ít tương tác với người dùng, và sau đó bạn có thể sử dụng chúng, thay vì có 90% mã của bạn là dành cho UI.
Nulano

Tôi đã chọn tùy chọn "Sử dụng của người khác" và hài lòng với kết quả này, từ kết quả này: Reflit.nl/blog/2003/c-inputbox . Lý do tôi chọn một trong số đó là sự vắng mặt của các giá trị kích thước / vị trí được mã hóa cứng. Cũng đầy hứa hẹn, là csharp-examples.net/inputbox- class . Cả hai đầu tiên có xác nhận của văn bản nhập. Câu trả lời được chấp nhận cho stackoverflow.com/questions/5427020/ cũng có vẻ tốt, nhưng không bao gồm tính năng xác thực đầu vào.
Nhà phát

106

Tạo động của một hộp thoại. Bạn có thể tùy chỉnh theo sở thích của bạn.

Lưu ý không có sự phụ thuộc bên ngoài ở đây ngoại trừ 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;
    }

sử dụng

string input="hede";
ShowInputDialog(ref input);

3
OK, rất dễ, tôi đã tìm thấy nó: inputBox.AcceptButton = okButton; inputBox.CatteryButton = hủyButton;
FIV

1
Đang làm việc! Tốt hơn giải pháp VB. Cảm ơn beehorf!
Filipe YaBa Polido

8
inputBox.StartPocation = FormStartPocation.CenterParent; sẽ căn giữa hộp thoại trên cửa sổ cha.
Andrew Cash

2
+1 để viết mã của riêng bạn và chia sẻ nó ở đây! những người khác quá lười biếng để làm như vậy và chỉ muốn điểm miễn phí dễ dàng.
Kairan

1
Biểu mẫu không hiển thị khi được sử dụng trong thử nghiệm đơn vị, bài đăng này sẽ hữu ích. stackoverflow.com/questions/1218517/ Mạnh
Ray Cheng

9

Không có cái nào cả. Nếu bạn thực sự muốn sử dụng VB InputBox trong C #, bạn có thể. Chỉ cần thêm tham chiếu đến Microsoft.VisualBasic.dll và bạn sẽ tìm thấy nó ở đó.

Nhưng tôi sẽ đề nghị không sử dụng nó. Đó là IMO xấu xí và lỗi thời.


18
Tôi nghĩ rằng bạn đang quá tử tế. Nó xấu xí và lỗi thời hơn thế nhiều!
BlackWasp

3
Không thể xác định canceltừ empty input stringthực sự là một lỗi IMO.
Joe.wang

6

Bạn không chỉ nên thêm Microsoft.VisualBasic vào danh sách tham chiếu của mình cho dự án mà còn nên khai báo 'bằng Microsoft.VisualBasic;' vì vậy bạn chỉ cần sử dụng 'Tương tác.Inputbox ("...")' thay vì Microsoft.VisualBasic.Interaction.Inputbox


3
Nếu bạn chỉ sử dụng một lần, điều này sẽ thêm lộn xộn nếu OP quyết định họ không muốn InputBox nữa. Ngoài ra, đây nên là một bình luận.
BalinKingOfMoria khôi phục CM

5

Trả về chuỗi người dùng đã nhập; chuỗi rỗng nếu họ nhấn Cancel:

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

Trả về Stringdưới dạng tham số ref , trả về truenếu chúng nhấn OKhoặc falsenếu chúng nhấn 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);
    }

Lưu ý : Bất kỳ mã nào được phát hành vào miền công cộng. Không cần ghi công.


public static int MulDiv (int number, int tử số, int mẫu số) {return (int) (((dài) số * tử số + (mẫu số >> 1)) / mẫu số); }
Peter Kalef 'DidiSoft

Toolkit
Markus L

1
@markusL Toolkit là lớp của tôi có triển khai MulDiv. Bạn có thể thấy bình luận của Peter để thực hiện ví dụ về MulDiv.
Ian Boyd

4

Thêm tham chiếu Microsoft.VisualBasicvà sử dụng chức năng này:

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

Số 2 cuối cùng là vị trí X / Y để hiển thị hộp thoại đầu vào.


3

Ý bạn là InputBox? Chỉ cần nhìn vào không gian tên Microsoft.VisualBasic.

C # và VB.Net chia sẻ một thư viện chung. Nếu một ngôn ngữ có thể sử dụng nó, thì ngôn ngữ khác cũng có thể.


2

Không thêm một tham chiếu đến 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", "メッセージ", "タイトル", "初期値");

Xem những điều này để biết thêm thông tin:
ScriptControl
MsgBox trong JScript
Input và MsgBox trong 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);

2

Tôi đã có thể đạt được điều này bằng cách mã hóa của riêng tôi. Tôi không thích mở rộng và dựa vào thư viện lớn vì một điều gì đó thô sơ.

Mẫu và thiết kế:

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;
}

Sử dụng:

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;
}

Lưu ý điều này thể hiện một chút kích thước tự động để giữ cho nó đẹp dựa trên số lượng văn bản bạn yêu cầu nó hiển thị. Tôi cũng biết rằng nó thiếu chuông và còi nhưng đó là một bước tiến vững chắc cho những người phải đối mặt với tình trạng khó xử tương tự này.


-2

Không có điều đó: tôi khuyên bạn nên viết nó cho chính mình và sử dụng nó bất cứ khi nào bạn cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.