I have a dialog where the user can input two integers with OK button. The entered values are saved to variables. However, if I close it from the close button it also save the last entered values, which means not only the OK button save them. what am I doing wrong here?
The dialog:
namespace WindowsFormsApplication1
{
public static class inputBoxDialog
{
public static void ShowDialog(string text1, string text2, string caption, int[] lastValue)
{
Form prompt = new Form();
prompt.Width = 500;
prompt.Height = 250;
prompt.Text = caption;
prompt.StartPosition = FormStartPosition.CenterScreen;
//input 1
Label textLabel = new Label() { Left = 50, Top = 20, Text = text1 };
NumericUpDown inputBox1 = new NumericUpDown() { Left = 50, Top = 50, Width = 400 };
inputBox1.Value = lastValue[0];
//input 2
Label textLabe2 = new Label() { Left = 50, Top = 100, Text = text2 };
NumericUpDown inputBox2 = new NumericUpDown() { Left = 50, Top = 130, Width = 400 };
inputBox2.Value = lastValue[1];
Button confirmation = new Button() { Text = "Ok", Left = 350, Width = 100, Top = 170 };
confirmation.Click += (sender, e) => { prompt.Close();};
prompt.Controls.Add(confirmation);
prompt.Controls.Add(textLabel);
prompt.Controls.Add(inputBox1);
prompt.Controls.Add(textLabe2);
prompt.Controls.Add(inputBox2);
prompt.ShowDialog();
lastValue[0] = (int)inputBox1.Value;
lastValue[1] = (int)inputBox2.Value;
}
}
}
I call the dialog here:
namespace WindowsFormsApplication1
{
public partial class MainWindow : Form
{
public MainWindow()
{
InitializeComponent();
}
int[] loopParams = new int[2] { 0, 0 };
private void button1_Click(object sender, EventArgs e)
{
inputBoxDialog.ShowDialog("For Loop Begin: ", "For Loop End: ", "Popup", loopParams);
//display the result
label1.Text = "1:- " + loopParams[0]+"\r\n2:- " + loopParams[1];
}
}
}
As pointed out by Jimi, you need to set the OK buttons DialogResult property to DialogResult.OK:
Button confirmation = new Button() { Text = "Ok", Left = 350, Width = 100, Top = 170, DialogResult = DialogResult.OK };
And to check the returned DialogResult value from the prompt.ShowDialog() method:
if (prompt.ShowDialog() == DialogResult.OK)
{
lastValue[0] = (int)inputBox1.Value;
lastValue[1] = (int)inputBox2.Value;
}
Here is your code with the above additions:
public static void ShowDialog(string text1, string text2, string caption, int[] lastValue)
{
Form prompt = new Form();
prompt.Width = 500;
prompt.Height = 250;
prompt.Text = caption;
prompt.StartPosition = FormStartPosition.CenterScreen;
//input 1
Label textLabel = new Label() { Left = 50, Top = 20, Text = text1 };
NumericUpDown inputBox1 = new NumericUpDown() { Left = 50, Top = 50, Width = 400 };
inputBox1.Value = lastValue[0];
//input 2
Label textLabe2 = new Label() { Left = 50, Top = 100, Text = text2 };
NumericUpDown inputBox2 = new NumericUpDown() { Left = 50, Top = 130, Width = 400 };
inputBox2.Value = lastValue[1];
Button confirmation = new Button() { Text = "Ok", Left = 350, Width = 100, Top = 170, DialogResult = DialogResult.OK };
confirmation.Click += (sender, e) => { prompt.Close(); };
prompt.Controls.Add(confirmation);
prompt.Controls.Add(textLabel);
prompt.Controls.Add(inputBox1);
prompt.Controls.Add(textLabe2);
prompt.Controls.Add(inputBox2);
if (prompt.ShowDialog() == DialogResult.OK)
{
// OK
lastValue[0] = (int)inputBox1.Value;
lastValue[1] = (int)inputBox2.Value;
}
else
{
// Cancel
}
}
Checking the prompt.DialogResult in the prompt.FormClosed event:
prompt.FormClosed += (sender, e) =>
{
if (prompt.DialogResult == DialogResult.OK)
{
// OK
}
else
{
// Cancel
}
};
Related
Based on /users/668272/bas dialog box. I tried writing more in order to get multiple values
public static class ControlInfo
{
public static TextBox[] TextData { get; set; }
}
public static class Prompt
{
public static Form prompt = new Form();
public static void ShowDialog(string Text, string caption)
{
//string[] inputval = new string[6];
prompt = new Form()
{
Width = 500,
Height = 650,
FormBorderStyle = FormBorderStyle.FixedDialog,
Text = caption,
StartPosition = FormStartPosition.CenterScreen
};
#region:create
Label textLabel = new Label() { Left = 20, Top = 20, Text = Text };
TextBox textBox1 = new TextBox() { Left = 50, Top = 100, Width = 400 };
Button confirmationok = new Button()
{ Text = "Save", Left = 250, Width = 100, Top = 550, DialogResult = DialogResult.OK };
Button confirmationcancel = new Button()
{ Text = "Cancel", Left = 350, Width = 100, Top = 550, DialogResult = DialogResult.Cancel };
confirmationok.Click += (sender, e) => { Save(); };
confirmationcancel.Click += (sender, e) => { prompt.Close(); };
prompt.Controls.Add(confirmationcancel);
prompt.Controls.Add(textBox1);
prompt.Controls.Add(textBox2);
prompt.Controls.Add(textBox3);
prompt.Controls.Add(textBox4);
prompt.Controls.Add(textBox5);
prompt.Controls.Add(textBox6);
prompt.Controls.Add(confirmationok);
prompt.Controls.Add(textLabel);
prompt.Controls.Add(textLabel1);
prompt.Controls.Add(textLabel2);
prompt.Controls.Add(textLabel3);
prompt.Controls.Add(textLabel4);
prompt.Controls.Add(textLabel5);
prompt.Controls.Add(textLabel6);
prompt.AcceptButton = confirmationok;
prompt.AcceptButton = confirmationcancel;
prompt.ShowDialog();
}
public static void Save()
{
var cArray = prompt.Controls.OfType<TextBox>().ToArray();
ControlInfo.TextData = cArray;
}
}
[Update] I tried using string[] to get the values but this keeps on happening: return inputval; 'Index was outside the bounds of the array.' So how do I return the values to string[] array properly?
[Update 2] Fixed the problem by creating a TextData[] to store the values then calling it out like this ControlInfo.TextData[0].Text
I used a Textdata class to store the values from dialog through SAVE button. The completed code is in the question
I have created prompt input box in which user enter two values and press button and i want to return values on button click and get these values in other method.
Here is my code
public static string ShowDialog(string text, string caption)
{
Form prompt = new Form()
{
Width = 500,
Height = 150,
FormBorderStyle = FormBorderStyle.FixedDialog,
Text = caption,
StartPosition = FormStartPosition.CenterScreen
};
Label textLabel = new Label() { Left = 50, Top = 10, Text = text };
Label textLabel2 = new Label() { Left = 50, Top = 55, Text = text };
textLabel2.Text = "Replace with";
TextBox textBox = new TextBox() { Left = 50, Top = 70, Width = 200 };
TextBox textBox2 = new TextBox() { Left = 50, Top = 30, Width = 200 };
Button confirmation = new Button() { Text = "Replace", Left = 350, Width = 100, Top = 70, DialogResult = DialogResult.OK };
confirmation.Click += (sender, e) => { prompt.Close(); };
prompt.Controls.Add(textBox);
prompt.Controls.Add(textBox2);
prompt.Controls.Add(textLabel2);
prompt.Controls.Add(confirmation);
prompt.Controls.Add(textLabel);
prompt.AcceptButton = confirmation;
return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : "";
}
private void stringReplacedToolStripMenuItem_Click(object sender, EventArgs e)
{
string promptValue = Form1.ShowDialog("Find What", "Replace");
}
I want to get values of textbox and textbox2 in other method.Thanks
Okay, just return an array with the two textbox values.
public static string[] ShowDialog(string text, string caption)
{
Form prompt = new Form()
{
Width = 500,
Height = 150,
FormBorderStyle = FormBorderStyle.FixedDialog,
Text = caption,
StartPosition = FormStartPosition.CenterScreen
};
Label textLabel = new Label() { Left = 50, Top = 10, Text = text };
Label textLabel2 = new Label() { Left = 50, Top = 55, Text = text };
textLabel2.Text = "Replace with";
TextBox textBox = new TextBox() { Left = 50, Top = 70, Width = 200 };
TextBox textBox2 = new TextBox() { Left = 50, Top = 30, Width = 200 };
Button confirmation = new Button() { Text = "Replace", Left = 350, Width = 100, Top = 70, DialogResult = DialogResult.OK };
confirmation.Click += (sender, e) => { prompt.Close(); };
prompt.Controls.Add(textBox);
prompt.Controls.Add(textBox2);
prompt.Controls.Add(textLabel2);
prompt.Controls.Add(confirmation);
prompt.Controls.Add(textLabel);
prompt.AcceptButton = confirmation;
return prompt.ShowDialog() == DialogResult.OK ? new string[] { textBox.Text, textBox2.Text } : null;
}
private void stringReplacedToolStripMenuItem_Click(object sender, EventArgs e)
{
string[] promptValue = Form1.ShowDialog("Find What", "Replace");
var textBoxValue = promptValue[0];
var textBox2Value = promptValue[1];
}
I have this template for MessageBox. I have changed so you can have a scrollbar, the only problem I have now is that the title is very separate from the message and I do not know how to unite them. Try everything, but I can not.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Point = System.Drawing.Point;
using Size = System.Drawing.Size;
namespace WpfApplication2.xDialog
{
class MsgBox : Form
{
private const int CS_DROPSHADOW = 0x00020000;
private static MsgBox _msgBox;
private readonly Panel _plHeader = new Panel();
private readonly Panel _plButton = new Panel();
private readonly Panel _plIcon = new Panel();
private readonly PictureBox _picIcon = new PictureBox();
private readonly FlowLayoutPanel _flpButtons = new FlowLayoutPanel();
// ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable
private readonly Label _lblTitle;
// ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable
private readonly RichTextBox _lblMessage;
private readonly List<Button> _buttonCollection = new List<Button>();
private static DialogResult _buttonResult;
private static Timer _timer;
private static Point _lastMousePos;
//[DllImport("user32.dll", CharSet = CharSet.Auto)]
//private static extern bool MessageBeep(uint type);
private MsgBox()
{
FormBorderStyle = FormBorderStyle.None;
BackColor = Color.FromArgb(190, 190, 190);
//BackColor = Color.DarkGreen;
StartPosition = FormStartPosition.CenterScreen;
//Padding = new Padding(3);
//Width = 400;
_lblTitle = new Label
{
ForeColor = Color.Black,
TextAlign = ContentAlignment.MiddleLeft,
Font = new Font("Segoe UI", 15),
BackColor = Color.Red,
AutoSize = true
};
_lblMessage = new RichTextBox
{
ForeColor = Color.Black,
Font = new Font("Segoe UI", 12),
Multiline = true,
WordWrap = true,
Dock = DockStyle.Fill,
ReadOnly = true,
BackColor = Color.Yellow,
BorderStyle = BorderStyle.None
};
_flpButtons.FlowDirection = FlowDirection.RightToLeft;
_flpButtons.Dock = DockStyle.Fill;
//PANEL DEL TITULO
_plHeader.Dock = DockStyle.Top;
_plHeader.Controls.Add(_lblTitle);
// PANEL DE LOS BOTONES
_plButton.Dock = DockStyle.Bottom;
_plButton.Padding = new Padding(20);
_plButton.BackColor = Color.FromArgb(170, 170, 170);
_plButton.Height = 80;
_plButton.Controls.Add(_flpButtons);
// ICONO
_picIcon.Width = 32;
_picIcon.Height = 32;
_picIcon.Location = new Point(20, 60);
// PANEL DEL ICONO
_plIcon.Dock = DockStyle.Left;
_plIcon.Padding = new Padding(20);
_plIcon.Width = 70;
_plIcon.BackColor = Color.Blue;
_plIcon.Controls.Add(_picIcon);
var controlCollection = new List<Control>
{
this,
_lblTitle,
_flpButtons,
_plHeader,
_plButton,
_plIcon,
_picIcon
};
foreach (var control in controlCollection)
{
control.MouseDown += MsgBox_MouseDown;
control.MouseMove += MsgBox_MouseMove;
}
Controls.Add(_lblMessage);
Controls.Add(_plHeader);
Controls.Add(_plIcon);
Controls.Add(_plButton);
}
public override sealed Color BackColor
{
get { return base.BackColor; }
set { base.BackColor = value; }
}
private static void MsgBox_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_lastMousePos = new Point(e.X, e.Y);
}
}
private static void MsgBox_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return;
_msgBox.Left += e.X - _lastMousePos.X;
_msgBox.Top += e.Y - _lastMousePos.Y;
}
public static DialogResult Show(string message)
{
_msgBox = new MsgBox { _lblMessage = { Text = message } };
InitButtons(Buttons.OK);
_msgBox.ShowDialog();
return _buttonResult;
}
public static DialogResult Show(string message, string title)
{
_msgBox = new MsgBox
{
_lblMessage = { Text = message },
_lblTitle = { Text = title },
Size = MessageSize(message, title)
};
InitButtons(Buttons.OK);
_msgBox.ShowDialog();
return _buttonResult;
}
public static DialogResult Show(string message, string title, Buttons buttons)
{
_msgBox = new MsgBox { _lblMessage = { Text = message }, _lblTitle = { Text = title } };
_msgBox._plIcon.Hide();
InitButtons(buttons);
_msgBox.Size = MessageSize(message, title);
_msgBox.ShowDialog();
return _buttonResult;
}
public static DialogResult Show(string message, string title, Buttons buttons, Icon icon)
{
_msgBox = new MsgBox { _lblMessage = { Text = message }, _lblTitle = { Text = title } };
InitButtons(buttons);
InitIcon(icon);
_msgBox.Size = MessageSize(message, title);
_msgBox.ShowDialog();
//MessageBeep(0);
return _buttonResult;
}
public static DialogResult Show(string message, string title, Buttons buttons, Icon icon, AnimateStyle style)
{
_msgBox = new MsgBox { _lblMessage = { Text = message }, _lblTitle = { Text = title }, Height = 0 };
InitButtons(buttons);
InitIcon(icon);
_timer = new Timer();
var formSize = MessageSize(message, title);
switch (style)
{
case AnimateStyle.SlideDown:
_msgBox.Size = new Size(formSize.Width, 0);
_timer.Interval = 1;
_timer.Tag = new AnimateMsgBox(formSize, style);
break;
case AnimateStyle.FadeIn:
_msgBox.Size = formSize;
_msgBox.Opacity = 0;
_timer.Interval = 20;
_timer.Tag = new AnimateMsgBox(formSize, style);
break;
case AnimateStyle.ZoomIn:
_msgBox.Size = new Size(formSize.Width + 100, formSize.Height + 100);
_timer.Tag = new AnimateMsgBox(formSize, style);
_timer.Interval = 1;
break;
}
_timer.Tick += timer_Tick;
_timer.Start();
_msgBox.ShowDialog();
//MessageBeep(0);
return _buttonResult;
}
static void timer_Tick(object sender, EventArgs e)
{
var timer = (Timer)sender;
var animate = (AnimateMsgBox)timer.Tag;
switch (animate.Style)
{
case AnimateStyle.SlideDown:
if (_msgBox.Height < animate.FormSize.Height)
{
_msgBox.Height += 17;
_msgBox.Invalidate();
}
else
{
_timer.Stop();
_timer.Dispose();
}
break;
case AnimateStyle.FadeIn:
if (_msgBox.Opacity < 1)
{
_msgBox.Opacity += 0.1;
_msgBox.Invalidate();
}
else
{
_timer.Stop();
_timer.Dispose();
}
break;
case AnimateStyle.ZoomIn:
if (_msgBox.Width > animate.FormSize.Width)
{
_msgBox.Width -= 17;
_msgBox.Invalidate();
}
if (_msgBox.Height > animate.FormSize.Height)
{
_msgBox.Height -= 17;
_msgBox.Invalidate();
}
break;
}
}
private static void InitButtons(Buttons buttons)
{
switch (buttons)
{
case Buttons.AbortRetryIgnore:
_msgBox.InitAbortRetryIgnoreButtons();
break;
case Buttons.OK:
_msgBox.InitOkButton();
break;
case Buttons.OKCancel:
_msgBox.InitOkCancelButtons();
break;
case Buttons.RetryCancel:
_msgBox.InitRetryCancelButtons();
break;
case Buttons.YesNo:
_msgBox.InitYesNoButtons();
break;
case Buttons.YesNoCancel:
_msgBox.InitYesNoCancelButtons();
break;
}
foreach (var btn in _msgBox._buttonCollection)
{
btn.ForeColor = Color.FromArgb(170, 170, 170);
btn.ForeColor = Color.Black;
btn.Font = new Font("Segoe UI", 8);
btn.Padding = new Padding(3);
btn.FlatStyle = FlatStyle.Flat;
btn.Height = 30;
btn.FlatAppearance.BorderColor = Color.FromArgb(99, 99, 98);
_msgBox._flpButtons.Controls.Add(btn);
}
}
private static void InitIcon(Icon icon)
{
switch (icon)
{
case Icon.Application:
_msgBox._picIcon.Image = SystemIcons.Application.ToBitmap();
break;
case Icon.Exclamation:
_msgBox._picIcon.Image = SystemIcons.Exclamation.ToBitmap();
break;
case Icon.Error:
_msgBox._picIcon.Image = SystemIcons.Error.ToBitmap();
break;
case Icon.Info:
_msgBox._picIcon.Image = SystemIcons.Information.ToBitmap();
break;
case Icon.Question:
_msgBox._picIcon.Image = SystemIcons.Question.ToBitmap();
break;
case Icon.Shield:
_msgBox._picIcon.Image = SystemIcons.Shield.ToBitmap();
break;
case Icon.Warning:
_msgBox._picIcon.Image = SystemIcons.Warning.ToBitmap();
break;
}
}
private void InitAbortRetryIgnoreButtons()
{
var btnAbort = new Button { Text = #"Abortar" };
btnAbort.Click += ButtonClick;
CancelButton = btnAbort;
var btnRetry = new Button { Text = #"Reintentar" };
btnRetry.Click += ButtonClick;
btnRetry.Width = 80;
var btnIgnore = new Button { Text = #"Ignorar" };
btnIgnore.Click += ButtonClick;
_buttonCollection.Add(btnIgnore);
_buttonCollection.Add(btnAbort);
_buttonCollection.Add(btnRetry);
}
private void InitOkButton()
{
var btnOk = new Button { Text = #"OK" };
btnOk.Click += ButtonClick;
CancelButton = btnOk;
_buttonCollection.Add(btnOk);
}
private void InitOkCancelButtons()
{
var btnOk = new Button { Text = #"OK" };
btnOk.Click += ButtonClick;
var btnCancel = new Button { Text = #"Cancelar" };
btnCancel.Click += ButtonClick;
CancelButton = btnCancel;
_buttonCollection.Add(btnCancel);
_buttonCollection.Add(btnOk);
}
private void InitRetryCancelButtons()
{
var btnRetry = new Button { Text = #"Reintentar" };
btnRetry.Click += ButtonClick;
var btnCancel = new Button { Text = #"Cancelar" };
btnCancel.Click += ButtonClick;
CancelButton = btnCancel;
_buttonCollection.Add(btnCancel);
_buttonCollection.Add(btnRetry);
}
private void InitYesNoButtons()
{
var btnYes = new Button { Text = #"Sí" };
btnYes.Click += ButtonClick;
var btnNo = new Button { Text = #"No" };
btnNo.Click += ButtonClick;
CancelButton = btnNo;
_buttonCollection.Add(btnNo);
_buttonCollection.Add(btnYes);
}
private void InitYesNoCancelButtons()
{
var btnYes = new Button { Text = #"Sí" };
btnYes.Click += ButtonClick;
var btnNo = new Button { Text = #"No" };
btnNo.Click += ButtonClick;
var btnCancel = new Button { Text = #"Cancelar" };
btnCancel.Click += ButtonClick;
CancelButton = btnCancel;
_buttonCollection.Add(btnCancel);
_buttonCollection.Add(btnNo);
_buttonCollection.Add(btnYes);
}
private static void ButtonClick(object sender, EventArgs e)
{
var btn = (Button)sender;
switch (btn.Text)
{
case "Abortar":
_buttonResult = DialogResult.Abort;
break;
case "Reintentar":
_buttonResult = DialogResult.Retry;
break;
case "Ignorar":
_buttonResult = DialogResult.Ignore;
break;
case "OK":
_buttonResult = DialogResult.OK;
break;
case "Cancelar":
_buttonResult = DialogResult.Cancel;
break;
case "Sí":
_buttonResult = DialogResult.Yes;
break;
case "No":
_buttonResult = DialogResult.No;
break;
}
_msgBox.Dispose();
}
private static Size MessageSize(string message, string title)
{
var g = _msgBox.CreateGraphics();
var width = 320;
var height = 320;
var messageSize = g.MeasureString(message, new Font("Segoe UI", 10));
var titleSize = g.MeasureString(title, new Font("Segoe UI", 15));
if (message.Length < 150)
{
if ((int)messageSize.Width > 350 || (int)titleSize.Width > 350)
{
width = (messageSize.Width > titleSize.Width)
? (int)messageSize.Width
: (int)(titleSize.Width + titleSize.Width / 4);
}
}
else
{
//var groups = (from Match m in Regex.Matches(message, ".{1,180}") select m.Value).ToArray();
//var lines = groups.Length + 1;
width = 775;
height += (int)(messageSize.Height + 50);
if (height > 575)
height = 575;
}
return new Size(width, height);
}
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.ClassStyle |= CS_DROPSHADOW;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var g = e.Graphics;
var rect = new Rectangle(new Point(0, 0), new Size(Width - 1, Height - 1));
var pen = new Pen(Color.FromArgb(0, 151, 251));
g.DrawRectangle(pen, rect);
}
public enum Buttons
{
AbortRetryIgnore = 1,
// ReSharper disable once InconsistentNaming
OK = 2,
// ReSharper disable once InconsistentNaming
OKCancel = 3,
RetryCancel = 4,
YesNo = 5,
YesNoCancel = 6
}
public new enum Icon
{
Application = 1,
Exclamation = 2,
Error = 3,
Warning = 4,
Info = 5,
Question = 6,
Shield = 7,
Search = 8
}
public enum AnimateStyle
{
SlideDown = 1,
FadeIn = 2,
ZoomIn = 3
}
//private void InitializeComponent()
//{
// SuspendLayout();
// //
// // MsgBox
// //
// ClientSize = new Size(300, 375);
// Name = "MsgBox";
// ResumeLayout(false);
//}
}
class AnimateMsgBox
{
public Size FormSize;
public readonly MsgBox.AnimateStyle Style;
public AnimateMsgBox(Size formSize, MsgBox.AnimateStyle style)
{
FormSize = formSize;
Style = style;
}
}
}
You need to set the Height property of _plHeader
If you need to change the height dynamically you can use Graphics.MeasureString, TextRenderer.MeasureText or an auto resize TextBox to get the required height of the panel
I was wondering how would I auto select a textbox when using a Prompt on windows form. My code below shows what I have tried, but it is still focusing on the button and not the textbox. Thank you in advance for the help and assistance.
Form prompt = new Form();
prompt.Width = 500;
prompt.Height = 200;
prompt.Text = caption;
Label textLabel = new Label() { Left = 50, Top = 20, Text = text };
TextBox textBox = new TextBox() { Left = 50, Top = 50, Width = 400 };
Button confirmation = new Button() { Text = "Ok", Left = 50, Width = 100, Top = 90 };
confirmation.Click += (sender, e) => { prompt.Close(); };
textBox.Select();
textBox.Focus();
prompt.Controls.Add(confirmation);
prompt.Controls.Add(textLabel);
prompt.Controls.Add(textBox);
prompt.ShowDialog();
return textBox.Text;
You need to wait to focus the textbox until after the form is shown. Before the form has been shown for the first time it is not able to focus anything. You can use the Shown event to execute some code after the form is first shown.
string text = "Text";
string caption = "caption";
Form prompt = new Form();
prompt.Width = 500;
prompt.Height = 200;
prompt.Text = caption;
Label textLabel = new Label() { Left = 50, Top = 20, Text = text };
TextBox textBox = new TextBox() { Left = 50, Top = 50, Width = 400 };
Button confirmation = new Button() { Text = "Ok", Left = 50, Width = 100, Top = 90 };
confirmation.Click += (s, e) => { prompt.Close(); };
prompt.Controls.Add(confirmation);
prompt.Controls.Add(textLabel);
prompt.Controls.Add(textBox);
prompt.Shown += (s, e) => textBox.Focus();
prompt.ShowDialog();
return textBox.Text;
I am doing C# application, and I want to change the style of a message box. Is it possible or not?
Example: change button style, fore color, etc.
You can't restyle the default MessageBox as that's dependant on the current Windows OS theme, however you can easily create your own MessageBox. Just add a new form (i.e. MyNewMessageBox) to your project with these settings:
FormBorderStyle FixedToolWindow
ShowInTaskBar False
StartPosition CenterScreen
To show it use myNewMessageBoxInstance.ShowDialog();. And add a label and buttons to your form, such as OK and Cancel and set their DialogResults appropriately, i.e. add a button to MyNewMessageBox and call it btnOK. Set the DialogResult property in the property window to DialogResult.OK. When that button is pressed it would return the OK result:
MyNewMessageBox myNewMessageBoxInstance = new MyNewMessageBox();
DialogResult result = myNewMessageBoxInstance.ShowDialog();
if (result == DialogResult.OK)
{
// etc
}
It would be advisable to add your own Show method that takes the text and other options you require:
public DialogResult Show(string text, Color foreColour)
{
lblText.Text = text;
lblText.ForeColor = foreColour;
return this.ShowDialog();
}
MessageBox::Show uses function from user32.dll, and its style is dependent on Windows, so you cannot change it like that, you have to create your own form
Here is the code needed to create your own message box:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MyStuff
{
public class MyLabel : Label
{
public static Label Set(string Text = "", Font Font = null, Color ForeColor = new Color(), Color BackColor = new Color())
{
Label l = new Label();
l.Text = Text;
l.Font = (Font == null) ? new Font("Calibri", 12) : Font;
l.ForeColor = (ForeColor == new Color()) ? Color.Black : ForeColor;
l.BackColor = (BackColor == new Color()) ? SystemColors.Control : BackColor;
l.AutoSize = true;
return l;
}
}
public class MyButton : Button
{
public static Button Set(string Text = "", int Width = 102, int Height = 30, Font Font = null, Color ForeColor = new Color(), Color BackColor = new Color())
{
Button b = new Button();
b.Text = Text;
b.Width = Width;
b.Height = Height;
b.Font = (Font == null) ? new Font("Calibri", 12) : Font;
b.ForeColor = (ForeColor == new Color()) ? Color.Black : ForeColor;
b.BackColor = (BackColor == new Color()) ? SystemColors.Control : BackColor;
b.UseVisualStyleBackColor = (b.BackColor == SystemColors.Control);
return b;
}
}
public class MyImage : PictureBox
{
public static PictureBox Set(string ImagePath = null, int Width = 60, int Height = 60)
{
PictureBox i = new PictureBox();
if (ImagePath != null)
{
i.BackgroundImageLayout = ImageLayout.Zoom;
i.Location = new Point(9, 9);
i.Margin = new Padding(3, 3, 2, 3);
i.Size = new Size(Width, Height);
i.TabStop = false;
i.Visible = true;
i.BackgroundImage = Image.FromFile(ImagePath);
}
else
{
i.Visible = true;
i.Size = new Size(0, 0);
}
return i;
}
}
public partial class MyMessageBox : Form
{
private MyMessageBox()
{
this.panText = new FlowLayoutPanel();
this.panButtons = new FlowLayoutPanel();
this.SuspendLayout();
//
// panText
//
this.panText.Parent = this;
this.panText.AutoScroll = true;
this.panText.AutoSize = true;
this.panText.AutoSizeMode = AutoSizeMode.GrowAndShrink;
//this.panText.Location = new Point(90, 90);
this.panText.Margin = new Padding(0);
this.panText.MaximumSize = new Size(500, 300);
this.panText.MinimumSize = new Size(108, 50);
this.panText.Size = new Size(108, 50);
//
// panButtons
//
this.panButtons.AutoSize = true;
this.panButtons.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this.panButtons.FlowDirection = FlowDirection.RightToLeft;
this.panButtons.Location = new Point(89, 89);
this.panButtons.Margin = new Padding(0);
this.panButtons.MaximumSize = new Size(580, 150);
this.panButtons.MinimumSize = new Size(108, 0);
this.panButtons.Size = new Size(108, 35);
//
// MyMessageBox
//
this.AutoScaleDimensions = new SizeF(8F, 19F);
this.AutoScaleMode = AutoScaleMode.Font;
this.ClientSize = new Size(206, 133);
this.Controls.Add(this.panButtons);
this.Controls.Add(this.panText);
this.Font = new Font("Calibri", 12F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0)));
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.Margin = new Padding(4);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.MinimumSize = new Size(168, 132);
this.Name = "MyMessageBox";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = FormStartPosition.CenterScreen;
this.ResumeLayout(false);
this.PerformLayout();
}
public static string Show(Label Label, string Title = "", List<Button> Buttons = null, PictureBox Image = null)
{
List<Label> Labels = new List<Label>();
Labels.Add(Label);
return Show(Labels, Title, Buttons, Image);
}
public static string Show(string Label, string Title = "", List<Button> Buttons = null, PictureBox Image = null)
{
List<Label> Labels = new List<Label>();
Labels.Add(MyLabel.Set(Label));
return Show(Labels, Title, Buttons, Image);
}
public static string Show(List<Label> Labels = null, string Title = "", List<Button> Buttons = null, PictureBox Image = null)
{
if (Labels == null) Labels = new List<Label>();
if (Labels.Count == 0) Labels.Add(MyLabel.Set(""));
if (Buttons == null) Buttons = new List<Button>();
if (Buttons.Count == 0) Buttons.Add(MyButton.Set("OK"));
List<Button> buttons = new List<Button>(Buttons);
buttons.Reverse();
int ImageWidth = 0;
int ImageHeight = 0;
int LabelWidth = 0;
int LabelHeight = 0;
int ButtonWidth = 0;
int ButtonHeight = 0;
int TotalWidth = 0;
int TotalHeight = 0;
MyMessageBox mb = new MyMessageBox();
mb.Text = Title;
//Image
if (Image != null)
{
mb.Controls.Add(Image);
Image.MaximumSize = new Size(150, 300);
ImageWidth = Image.Width + Image.Margin.Horizontal;
ImageHeight = Image.Height + Image.Margin.Vertical;
}
//Labels
List<int> il = new List<int>();
mb.panText.Location = new Point(9 + ImageWidth, 9);
foreach (Label l in Labels)
{
mb.panText.Controls.Add(l);
l.Location = new Point(200, 50);
l.MaximumSize = new Size(480, 2000);
il.Add(l.Width);
}
int mw = Labels.Max(x => x.Width);
il.ToString();
Labels.ForEach(l => l.MinimumSize = new Size(Labels.Max(x => x.Width), 1));
mb.panText.Height = Labels.Sum(l => l.Height);
mb.panText.MinimumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), ImageHeight);
mb.panText.MaximumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), 300);
LabelWidth = mb.panText.Width;
LabelHeight = mb.panText.Height;
//Buttons
foreach (Button b in buttons)
{
mb.panButtons.Controls.Add(b);
b.Location = new Point(3, 3);
b.TabIndex = Buttons.FindIndex(i => i.Text == b.Text);
b.Click += new EventHandler(mb.Button_Click);
}
ButtonWidth = mb.panButtons.Width;
ButtonHeight = mb.panButtons.Height;
//Set Widths
if (ButtonWidth > ImageWidth + LabelWidth)
{
Labels.ForEach(l => l.MinimumSize = new Size(ButtonWidth - ImageWidth - mb.ScrollBarWidth(Labels), 1));
mb.panText.Height = Labels.Sum(l => l.Height);
mb.panText.MinimumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), ImageHeight);
mb.panText.MaximumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), 300);
LabelWidth = mb.panText.Width;
LabelHeight = mb.panText.Height;
}
TotalWidth = ImageWidth + LabelWidth;
//Set Height
TotalHeight = LabelHeight + ButtonHeight;
mb.panButtons.Location = new Point(TotalWidth - ButtonWidth + 9, mb.panText.Location.Y + mb.panText.Height);
mb.Size = new Size(TotalWidth + 25, TotalHeight + 47);
mb.ShowDialog();
return mb.Result;
}
private FlowLayoutPanel panText;
private FlowLayoutPanel panButtons;
private int ScrollBarWidth(List<Label> Labels)
{
return (Labels.Sum(l => l.Height) > 300) ? 23 : 6;
}
private void Button_Click(object sender, EventArgs e)
{
Result = ((Button)sender).Text;
Close();
}
private string Result = "";
}
}