Was ist die C # -Version von VB.nets InputDialog?

150

Was ist die C # -Version der InputBox von VB.net?

wusher
quelle

Antworten:

233

Fügen Sie einen Verweis auf hinzu Microsoft.VisualBasic, InputBoxbefindet sich im Microsoft.VisualBasic.InteractionNamespace:

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

Nur das erste Argument für promptist obligatorisch

Ozgur Ozcitak
quelle
Was ist, wenn ich ein Passwort vom Benutzer erhalten möchte?
hims056
3
@ hims056 InputBoxunterstützt maskierte Eingaben nicht von Haus aus. Sie müssen Ihr eigenes Eingabeformular rollen.
Ozgur Ozcitak
4
Einfach importieren, using Microsoft.VisualBasicdamit Sie einfach schreibenInteraction.InputBox()
Edward Karak
Kann das VB-Eingabefeld einen Wert erhalten, der von Anfang an dort ausgefüllt werden muss? (bearbeiten) Nevermind, das ist die "Standardeinstellung", wie ich sehe.
Nyerguds
3
Ich habe mindestens 10 Mal danach gesucht. Immer resultierend aus dieser Antwort. Würde wieder upvoten, wenn ich könnte. Vielen Dank!
C4d
108

Etwas zusammenfassen:

  • Es gibt keine in C # .
  • Sie können den Dialog in Visual Basic verwenden, indem Sie einen Verweis auf Microsoft.VisualBasic hinzufügen:

    1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Ordner Referenzen .
    2. Wählen Sie Referenz hinzufügen ...
    3. In den .NET - Registerkarte (in neuerem Visual Studio verions - Assembly tab) - wählen Microsoft.VisualBasic
    4. Klicken Sie auf OK

Dann können Sie den zuvor genannten Code verwenden:

string input = Microsoft.VisualBasic.Interaction.InputBox("Prompt", "Title", "Default", 0, 0);
  • Schreiben Sie Ihre eigene InputBox.
  • Verwenden Sie die eines anderen .

Trotzdem schlage ich vor, dass Sie zunächst die Notwendigkeit eines Eingabefelds in Betracht ziehen. Dialoge sind nicht immer der beste Weg, um Dinge zu tun, und manchmal schaden sie mehr als sie nützen - aber das hängt von der jeweiligen Situation ab.

Tomas Sedovic
quelle
Sie können den Dialog von C # aus verwenden, indem Sie auch diese Referenz hinzufügen.
Joel Coehoorn
3
Ja sie sind. Aber es scheint mir, dass sie in den meisten Fällen im Versandcode schlecht sind.
Tomas Sedovic
+1 für den Link, den Tomas gepostet hat. Dieser ist besser als die Virtual Basic InputBox.
Joe.wang
Immer noch besser als die Verwendung von / subsystem: console ... Manchmal benötigen Sie nur sehr wenig Interaktion mit dem Benutzer, und dann können Sie sie verwenden, anstatt 90% Ihres Codes für die Benutzeroberfläche zu verwenden.
Nulano
Ich habe die Option "Verwenden Sie die Option eines anderen" gewählt und bin mit dem Ergebnis zufrieden: Reflectionit.nl/blog/2003/c-inputbox . Grund, warum ich mich für das Fehlen fest codierter Größen- / Standortwerte entschieden habe. Ebenfalls vielversprechend ist csharp-examples.net/inputbox-class . Beide ersten beiden haben eine Validierung des eingegebenen Textes. Die akzeptierte Antwort für stackoverflow.com/questions/5427020/… sieht ebenfalls gut aus, enthält jedoch nicht die Funktion zur Eingabevalidierung.
Developer63
106

Dynamische Erstellung eines Dialogfelds. Sie können nach Ihrem Geschmack anpassen.

Beachten Sie, dass hier außer winform keine externe Abhängigkeit besteht

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

Verwendung

string input="hede";
ShowInputDialog(ref input);
Gorkem
quelle
3
OK, sehr einfach, ich habe es gefunden: inputBox.AcceptButton = okButton; inputBox.CancelButton = cancelButton;
FIV
1
Arbeiten! Besser als VB-Lösung. Danke beehorf!
Filipe YaBa Polido
8
inputBox.StartPosition = FormStartPosition.CenterParent; zentriert den Dialog im übergeordneten Fenster.
Andrew Cash
2
+1 für das Schreiben und Teilen Ihres eigenen Codes hier! andere sind zu faul dafür und wollen einfach nur freie Punkte.
Kairan
1
Das Formular ist bei Unit-Tests nicht sichtbar. Dieser Beitrag ist hilfreich. stackoverflow.com/questions/1218517/…
Ray Cheng
9

Es gibt keinen. Wenn Sie die VB InputBox wirklich in C # verwenden wollten, können Sie. Fügen Sie einfach einen Verweis auf Microsoft.VisualBasic.dll hinzu, und Sie finden ihn dort.

Aber ich würde vorschlagen, es nicht zu benutzen. Es ist hässlich und veraltet IMO.

Ryan Farley
quelle
18
Ich denke du bist zu nett. Es ist viel hässlicher und veralteter als das!
BlackWasp
3
Kann nicht identifizieren, dass cancelvon empty input stringtatsächlich ein Fehler IMO ist.
Joe.wang
6

Sie sollten nicht nur Microsoft.VisualBasic zu Ihrer Referenzliste für das Projekt hinzufügen, sondern auch "using Microsoft.VisualBasic" deklarieren. Sie müssen also nur 'Interaction.Inputbox ("...")' anstelle von Microsoft.VisualBasic.Interaction.Inputbox verwenden

AdamL
quelle
3
Wenn Sie es nur einmal verwenden, führt dies zu Unordnung, wenn das OP entscheidet, dass die InputBox nicht mehr verwendet werden soll. Dies sollte auch ein Kommentar sein.
BalinKingOfMoria CMs wieder herstellen
5

Gibt die vom Benutzer eingegebene Zeichenfolge zurück. leere Zeichenfolge, wenn sie treffen Cancel:

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

Gibt den Parameter Stringals ref zurück und gibt zurück, truewenn sie treffen OKoder falsewenn sie treffen 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);
    }

Hinweis : Jeder Code wird öffentlich zugänglich gemacht. Keine Zuordnung erforderlich.

Ian Boyd
quelle
public static int MulDiv (int Zahl, int Zähler, int Nenner) {return (int) (((lange) Zahl * Zähler + (Nenner >> 1)) / Nenner); }
Peter Kalef 'DidiSoft
Was ist Toolkit?
Markus L
1
@markusL Toolkit war meine Klasse, die eine Implementierung von enthält MulDiv. Sie können Peters Kommentar für eine Beispielimplementierung von sehen MulDiv.
Ian Boyd
4

Verweis hinzufügen Microsoft.VisualBasicund diese Funktion verwenden:

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

Die letzten 2 Zahlen sind eine X / Y-Position, um den Eingabedialog anzuzeigen.

Chakrit
quelle
3

Du meinst InputBox? Schauen Sie einfach in den Microsoft.VisualBasic-Namespace.

C # und VB.Net teilen sich eine gemeinsame Bibliothek. Wenn eine Sprache es verwenden kann, kann es auch die andere.

Joel Coehoorn
quelle
2

Ohne einen Verweis auf Microsoft.VisualBasic hinzuzufügen:

// "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", "メッセージ", "タイトル", "初期値");

Weitere Informationen finden Sie hier:
ScriptControl MsgBox
in JScript
Input und MsgBox in 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
quelle
2

Ich konnte dies erreichen, indem ich meine eigenen codierte. Ich mag es nicht, in große Bibliotheken zu gehen und mich auf etwas zu verlassen, um etwas rudimentäres zu tun.

Form und Designer:

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

Verwendung:

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

Beachten Sie, dass dies eine gewisse automatische Größenanpassung aufweist, damit es basierend auf der angezeigten Textmenge hübsch bleibt. Ich weiß auch, dass es an Schnickschnack mangelt, aber es ist ein solider Schritt vorwärts für diejenigen, die sich demselben Dilemma gegenübersehen.

David Carrigan
quelle
-2

Es gibt so etwas nicht: Ich empfehle, es selbst zu schreiben und es zu verwenden, wann immer Sie es brauchen.

MADMap
quelle