как обновить строку "_servername" из второй формы - PullRequest
0 голосов
/ 08 февраля 2012

Я новичок в программировании на C #, но я знаю, что атрибуты должны быть инкапсулированы в классе. Поэтому я использовал частную декларацию

private string _servername;

Проблема в том, что я не могу обновить _servername из 2-й формы. Я нажал на кнопку ChangeName. Новый Form2 появился. Я нажал на кнопку NewName. Методы из Form1 были успешно завершены, и MessageBox в методе _Server2 показал мне, что значение _servername должно быть "TEST" Когда я нажимаю кнопку CurrentServerName, значение _servername по-прежнему равно «localhost». Не могли бы вы сказать мне, почему? Как это исправить? Заранее спасибо

ФОРМА 1

namespace Test
{
    public partial class Form1 : Form
    {
        private string _servername;
        public Form1()
        {
            InitializeComponent();
            _servername = "localhost";
        }

        public string _Server(string _server)
        {
            _servername = _server;
            string serverlist2 = _server;            
            _Server2(serverlist2);
            return serverlist2;
        }

        public void _Server2(string _server2)
        {
            _servername = _server2;
            MessageBox.Show(_servername);
        }

        private void ChangeName_Click(object sender, EventArgs e)
        {
            Form2 _Form2 = new Form2();
            _Form2.Show();
        }

        private void CurrentServerName_Click(object sender, EventArgs e)
        {
            MessageBox.Show(_servername);
        }

    }
}

ФОРМА 2

namespace Test
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void NewName_Click(object sender, EventArgs e)
        {
            Form1 _Form1 = new Form1();
            _Form1._Server("TEST");
            this.Close();
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Это не работает, потому что вы создаете новый "экземпляр" Form1 внутри Form2, это не то же самое, что и другие Form1.

Вам необходимо изменить форму Form следующим образом:

private void ChangeName_Click(object sender, EventArgs e) 
{ 
    using (Form2 form2 = new Form2())
    {
        form2.Show();
        _Server(form2.ServerName);
    } //Ensure the form is Disposed.
} 

И Form2 вот так:

namespace Test   
{   
    public partial class Form2 : Form   
    {   
        public Form2()   
        {   
            InitializeComponent();   
        }   

        public String ServerName { get; private set; } //Can only be set in this class, but read by all.

        private void NewName_Click(object sender, EventArgs e)   
        {   
            ServerName = "Test";   
            Close();   
        }   
    }   
}  

РЕДАКТИРОВАТЬ: Еще один момент. Называть методы, такие как _Server(), и локальные переменные, такие как _Form2, - плохая практика, они должны быть Server() и form2. Посмотрите эту статью MSDN , а также вопрос .

0 голосов
/ 08 февраля 2012

Вы не хотите создавать новый экземпляр Form1 внутри Form2.Вместо этого, когда вы создаете экземпляр Form2, чтобы показать его, передайте ссылку на текущий экземпляр Form1 в конструктор.Затем вы можете получить доступ к методам существующего экземпляра Form1.Вот пример:

Форма 1

private void ChangeName_Click(object sender, EventArgs e)
{
    // Pass a reference to this form instance using the 'this' keyword
    Form2 _Form2 = new Form2(this);
    _Form2.Show();
}

Форма 2

namespace Test
{
    public partial class Form2 : Form
    {
        // Hold an instance to Form1
        private Form1 mForm1;

        public Form2(Form1 form1)
        {
            // Store instance to form1
            mForm1 = form1;

            InitializeComponent();
        }

        private void NewName_Click(object sender, EventArgs e)
        {
            // Change name on existing instance of form 1
            mForm1._Server("TEST");
            this.Close();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...