Проблема C #: как мне манипулировать Textbox на одной форме из другой формы? - PullRequest
0 голосов
/ 04 февраля 2009

Я пытаюсь создать собственное окно ошибки для проекта, над которым я работаю. Когда я показываю свое окно с ошибкой, у меня нет возможности передать сообщение об ошибке и пользовательское сообщение в окно «Ошибка», потому что «ErrorMessage.Text» не может быть видно в моих классах.

Я пошел в сгенерированный дизайнером кода код и попытался сделать TextBox статичным, но это просто ломает вещи. Могу ли я сделать TextBox общедоступным / статическим, чтобы я мог изменить его из другой формы?

  1. Как сделать TextBox Static Public открытым, чтобы я мог манипулировать им в других формах или есть другой способ сделать это?

EDIT:

Хорошо, для получения дополнительной информации ...

У меня есть собственная форма. Это называется «formErrorWindow». Мне нужно отобразить форму, которую я предварительно разработал, с набором сообщений из другой формы. Единственный способ сделать это - это создать функцию в области конструктора окон для формы и установить переменные с помощью this.errorMsg.text = error. Единственный способ увидеть эту функцию - установить статическую функцию. Если я устанавливаю функцию в Static, когда я пытаюсь поставить «this.errorMsg.Text = error», я получаю эту ошибку: Ссылка на объект требуется для нестатического поля, метода или свойства.

Вот что я пытался:

    namespace LCR_ShepherdStaffupdater_1._0
    {
        partial class formErrorWindow
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            public 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>
// ********* HERE IS THE FUNCTION THAT IVE ADDED BELOW. THIS WOULD WORK BUT.... *********
     public static void showError(string errorTitle, string usrMsg, string errorMsg)
    {
        formErrorWindow errorWindow = new formErrorWindow();
        errorMsgItem.Text = errorMsg;
        errorTitleItem.Text = "Error! : " + errorTitle;
        usrMsgItem.Text = usrMsg;
        errorWindow.ShowDialog();
    }
// ********* HERE IS THE FUNCTION THAT IVE ADDED ABOVE. THIS WOULD WORK BUT.... *********
// ********* I get an error: "An object reference is required for the non-static field, method, or property." *********
            public void InitializeComponent()
            {
                System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(formErrorWindow));
                this.usrMsgItem = new System.Windows.Forms.TextBox();
                this.errorTitleItem = new System.Windows.Forms.Label();
                this.errorMsgItem = new System.Windows.Forms.TextBox();
                this.button1 = new System.Windows.Forms.Button();
                this.panel1 = new System.Windows.Forms.Panel();
                this.label2 = new System.Windows.Forms.Label();
                this.panel1.SuspendLayout();
                this.SuspendLayout();
                // 
                // usrMsgItem
                // 
                this.usrMsgItem.Enabled = false;
                this.usrMsgItem.Location = new System.Drawing.Point(13, 37);
                this.usrMsgItem.Multiline = true;
                this.usrMsgItem.Name = "usrMsgItem";
                this.usrMsgItem.Size = new System.Drawing.Size(334, 81);
                this.usrMsgItem.TabIndex = 0;
                this.usrMsgItem.Text = "Undefined";
                // 
                // errorTitleItem
                // 
                this.errorTitleItem.AutoSize = true;
                this.errorTitleItem.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                this.errorTitleItem.ForeColor = System.Drawing.Color.Red;
                this.errorTitleItem.Location = new System.Drawing.Point(12, 9);
                this.errorTitleItem.Name = "errorTitleItem";
                this.errorTitleItem.Size = new System.Drawing.Size(152, 20);
                this.errorTitleItem.TabIndex = 1;
                this.errorTitleItem.Text = "Error! : Undefined";
                // 
                // errorMsgItem
                // 
                this.errorMsgItem.Enabled = false;
                this.errorMsgItem.Location = new System.Drawing.Point(0, 21);
                this.errorMsgItem.Multiline = true;
                this.errorMsgItem.Name = "errorMsgItem";
                this.errorMsgItem.Size = new System.Drawing.Size(329, 101);
                this.errorMsgItem.TabIndex = 2;
                this.errorMsgItem.Text = "Undefined";
                // 
                // button1
                // 
                this.button1.Location = new System.Drawing.Point(272, 256);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.TabIndex = 3;
                this.button1.Text = "Continue";
                this.button1.UseVisualStyleBackColor = true;
                this.button1.Click += new System.EventHandler(this.button1_Click);
                // 
                // panel1
                // 
                this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128)))));
                this.panel1.Controls.Add(this.label2);
                this.panel1.Controls.Add(this.errorMsgItem);
                this.panel1.Location = new System.Drawing.Point(12, 124);
                this.panel1.Name = "panel1";
                this.panel1.Size = new System.Drawing.Size(335, 126);
                this.panel1.TabIndex = 4;
                // 
                // label2
                // 
                this.label2.AutoSize = true;
                this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                this.label2.Location = new System.Drawing.Point(68, 1);
                this.label2.Name = "label2";
                this.label2.Size = new System.Drawing.Size(189, 17);
                this.label2.TabIndex = 3;
                this.label2.Text = "Technical Error Message";
                // 
                // formErrorWindow
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
                this.ClientSize = new System.Drawing.Size(359, 290);
                this.Controls.Add(this.panel1);
                this.Controls.Add(this.button1);
                this.Controls.Add(this.errorTitleItem);
                this.Controls.Add(this.usrMsgItem);
                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
                this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
                this.MaximizeBox = false;
                this.MinimizeBox = false;
                this.Name = "formErrorWindow";
                this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
                this.Text = "Error!";
                this.VisibleChanged += new System.EventHandler(this.formErrorWindow_VisibleChanged);
                this.panel1.ResumeLayout(false);
                this.panel1.PerformLayout();
                this.ResumeLayout(false);
                this.PerformLayout();

            }

            #endregion

            private System.Windows.Forms.Button button1;
            private System.Windows.Forms.Panel panel1;
            private System.Windows.Forms.Label label2;
            public System.Windows.Forms.TextBox usrMsgItem;
            public System.Windows.Forms.Label errorTitleItem;
            public System.Windows.Forms.TextBox errorMsgItem;
        }
    }

Ищите функцию, которую я добавил выше. Как заставить это скомпилировать и сделать то, что я хочу, БЕЗ этой ошибки, которую я продолжаю получать: Ссылка на объект требуется для нестатического поля, метода или свойства.

Ответы [ 9 ]

6 голосов
/ 04 февраля 2009

Я бы просто передал сообщение в качестве параметра конструктора.

MyMessageBox messageBox = new MyMessageBox("My error message");
messageBox.Show();
1 голос
/ 07 июня 2011
public partial class Form1 : Form
    {
        private static TextBox box;

        public Form1()
        {
            InitializeComponent();
        }



        private void Form1_Load(object sender, EventArgs e)
        {

            // box
            box = new TextBox();
            box.Location = new System.Drawing.Point(87, 230);
            box.Name = "box";
            box.Size = new System.Drawing.Size(100, 20);
            box.TabIndex = 1;

            this.Controls.Add(box);

        }
    }
1 голос
/ 04 февраля 2009

Да! сделайте публичную функцию, которая может получить этот текст:

pseudo: public void updateTextBox(string new_text)

и оттуда функция обновит текстовое поле.

не смешивать интерфейс с логикой.

0 голосов
/ 29 августа 2018

Передайте TextBox в функцию / метод следующим образом

public static void myFunc(TextBox textBox1)
{
    textBox1.Text = "do stuff";
{
0 голосов
/ 08 февраля 2009

Похоже, вы на правильном пути, добавив публичную функцию, которую вы сделали, но вам не нужно делать ее статичной. Как правило, если вам нужно войти в код, сгенерированный дизайнером, что-то не так, поэтому давайте уйдем - это не значит, что вы не можете добавить код в форму, очевидно, но не надо сделать это в этом разделе:)

Ошибка, которую вы получаете, я полагаю, происходит из-за наличия объекта, который не был создан (т. Е. Создается форма ошибки, например:

formErrorWindow myErrorWindow;

вместо того, чтобы создавать его / создавать его экземпляр следующим образом:

formErrorWindow myErrorWindow = new formErrorWindow();

Вы сделали функцию статической, так что вы можете видеть ее откуда угодно, однако эта функция на самом деле ничего не может сделать, потому что форма, на которой она работает, пока не существует, пока вы не используете "= new formErrorWindow (); ».

Так что, если я нахожусь в форме с именем «MainForm» и хочу показать ошибку, используя имя предоставленной вами функции, это будет сделано так:

formErrorWindow myErrorWindow = new formErrorWindow();
myErrorWindow.showError("Title", "User Message Here", "Error Message Here");
myErrorWindow.ShowDialog();

Ключ заключается в том, чтобы убедиться, что ничто не является статичным, а затем убедиться, что вы инициализируете formErrorWindow с помощью = new formErrorWindow ();

0 голосов
/ 04 февраля 2009

Вы можете создать метод в классе окна Error, который может быть что-то вроде:

public void SetErrorText(string errorText)
{
   this.ErrorMessage.Text = errorText; // assuming the TextBox' ID is ErrorMessage.
}
0 голосов
/ 04 февраля 2009

Если вы действительно хотите получить прямой доступ к элементам управления:

  public Form2(Form1 form1)
        {
            InitializeComponent();

            Owner = form1;
            _form1 = form1;
        }

теперь вы можете получить доступ к элементам управления в форме1 следующим образом:

_form1.theForm1ControlName
0 голосов
/ 04 февраля 2009

Предоставление публичного доступа к объекту, содержащемуся в вашем классе, может быть дизайном. Как насчет записи свойства в классе окна ошибок с именем ErrorText и в этом свойстве установить ErrorMessage.Text для переданной строки? Или я что-то упустил?

0 голосов
/ 04 февраля 2009

Вы можете сделать TextBox общедоступным в первую очередь. Затем создайте статическую переменную формы (имя вашей формы) и поместите форму туда каждый раз, когда она загружается ... На мой взгляд, это не очень хорошее решение, но, не зная больше о вашем дизайне, я могу придумать лучшее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...