A Scrollable MessageBox in C#

前端 未结 3 692
耶瑟儿~
耶瑟儿~ 2021-02-10 01:50

I use Addin in VS2008, C#, and I need show messages (error messages and others).

I don\'t know the length of messages, and therefore I want use Scrollable MessageBox.

3条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-02-10 02:28

    I just implemented a simple form with a scrollable multiline TextBox, when I needed something similar to show long status reports or exceptions caught by the application. You can alter borders, etc. to make it look more like a label, if you wish. Then just new one up and call its ShowDialog method, or wrap its instantiation in some static member similar to MessageBox. Far as I know, the .NET team hasn't built in anything more flexible than MessageBox.

    EDIT FROM COMMENT:

    The code to make a window with a textbox that can be shown using a static method is fairly simple. While I generally don't like overt requests for code, I'll oblige this time:

    public class SimpleReportViewer : Form
    {
        /// 
        /// Initializes a new instance of the  class.
        /// 
        //You can remove this constructor if you don't want to use the IDE forms designer to tweak its layout.
        public SimpleReportViewer()
        {
            InitializeComponent();
            if(!DesignMode) throw new InvalidOperationException("Default constructor is for designer use only. Use static methods instead.");
        }
    
        private SimpleReportViewer(string reportText)
        {
            InitializeComponent();
            txtReportContents.Text = reportText;
        }
    
        private SimpleReportViewer(string reportText, string reportTitle)
        {
            InitializeComponent();
            txtReportContents.Text = reportText;
            Text = "Report Viewer: {0}".FormatWith(reportTitle);
        }
    
        /// 
        /// Shows a SimpleReportViewer with the specified text and title.
        /// 
        /// The report text.
        /// The report title.
        public static void Show(string reportText, string reportTitle)
        {
            new SimpleReportViewer(reportText, reportTitle).Show();
        }
    
        /// 
        /// Shows a SimpleReportViewer with the specified text, title, and parent form.
        /// 
        /// The report text.
        /// The report title.
        /// The owner.
        public static void Show(string reportText, string reportTitle, Form owner)
        {
            new SimpleReportViewer(reportText, reportTitle).Show(owner);
        }
    
        /// 
        /// Shows a SimpleReportViewer with the specified text, title, and parent form as a modal dialog that prevents focus transfer.
        /// 
        /// The report text.
        /// The report title.
        /// The owner.
        public static void ShowDialog(string reportText, string reportTitle, Form owner)
        {
            new SimpleReportViewer(reportText, reportTitle).ShowDialog(owner);
        }
    
        /// 
        /// Shows a SimpleReportViewer with the specified text and the default window title.
        /// 
        /// The report text.
        public static void Show(string reportText)
        {
            new SimpleReportViewer(reportText).Show();
        }
    
        /// 
        /// Shows a SimpleReportViewer with the specified text, the default window title, and the specified parent form.
        /// 
        /// The report text.
        /// The owner.
        public static void Show(string reportText, Form owner)
        {
            new SimpleReportViewer(reportText).Show(owner);
        }
    
        /// 
        /// Required designer variable.
        /// 
        private System.ComponentModel.IContainer components = null;
    
        /// 
        /// Clean up any resources being used.
        /// 
        /// true if managed resources should be disposed; otherwise, false.
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
    
        #region Windows Form Designer generated code
    
        /// 
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// 
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SimpleReportViewer));
            this.txtReportContents = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // txtReportContents
            // 
            this.txtReportContents.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.txtReportContents.Location = new System.Drawing.Point(13, 13);
            this.txtReportContents.Multiline = true;
            this.txtReportContents.Name = "txtReportContents";
            this.txtReportContents.ReadOnly = true;
            this.txtReportContents.ScrollBars = System.Windows.Forms.ScrollBars.Both;
            this.txtReportContents.Size = new System.Drawing.Size(383, 227);
            this.txtReportContents.TabIndex = 0;
            // 
            // SimpleReportViewer
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(408, 252);
            this.Controls.Add(this.txtReportContents);
            this.Icon = Properties.Resources.some_icon;
            this.Name = "SimpleReportViewer";
            this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;
            this.Text = "Report Viewer";
            this.ResumeLayout(false);
            this.PerformLayout();
    
        }
    
        #endregion
    
        private TextBox txtReportContents;
    }
    

    Usage:

    var message = GetSomeRidiculouslyLongMessage();
    //assumes it's called from inside another Form
    SimpleReportViewer.ShowDialog(message, "My Message", this);
    

    This particular implementation also supports displaying as an ordinary, non-dialog window using overloads of the Show() method.

提交回复
热议问题