2016-08-29 3 views
-2

У меня есть форма1, form2 и класс. Я хочу использовать form2 для изменения переменной в классе, а затем прочитать эту переменную в form1.Изменить значение в классе, а затем использовать его в другой форме

Дело в том, что переменная не изменяется, когда я пытаюсь ее прочитать из формы1, и она остается после того, как я снова открою форму2.

Это мой код:

Form1

namespace app1 { 
public partial class Form1 : Form { 
    Class1 md = new Class1(); 

    public Form1() { 
     InitializeComponent(); 
    } 

    private void loginToolStripMenuItem_Click(object sender, EventArgs e) { 
     Login login = new Login(); 
     login.MdiParent = this; 
     login.enbctrs += new ShowFrm(enablecrts); 
     login.disctrs += new ShowFrm(disablecrts); 
     login.Show(); 
    } 

    private void Form1_Load(object sender, EventArgs e) {    
     if (md.user == null) { 
      disablecrts(); 
      stat_usr.Text = "No active user"; 
     } else { 
      stat_usr.Text = md.user.ToString(); 
     } 
    } 

    void disablecrts() { 
     stat_usr.Text = "No active user"; 
    } 

    void enablecrts() { 
     stat_usr.Text = md.user;  
    } 
}} 

Form2

namespace app1.Forms { 
public delegate void ShowFrm(); 
public partial class Login : Form { 

    public event ShowFrm enbctrs; 
    public event ShowFrm disctrs; 
    int ing_counter = 0; 
    Class1 md = new Class1(); 
    public Login() { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) { 
     string u = "user"; 
     string p = "pass"; 
     if(Txt_user.Text == u && Txt_pass.Text == p) { 
      string msg = "Welcome: " + u + ""; 
      MessageBox.Show(msg, "", MessageBoxButtons.OK); 
      md.changeusr(u);     
      active_user.Text = md.user.ToString(); 
      enbctrs(); 
     } 

    private void Login_Load(object sender, EventArgs e) { 
     if (md.user == null) { 
      active_user.Text = "No active user"; 
     } else { 
      active_user.Text = md.user.ToString(); 
     } 
    } 
}} 

Class1

namespace app1.Modules { 
class Class1 { 
    public string user; 
    public void changeusr(string u) { 
     user = u; 
     return;     
    }   
}} 
+3

Я не уверен, чего вы пытаетесь достичь. Вы загружаете свой экземпляр Class1 при каждой загрузке страницы. Вам нужен какой-то механизм сохранения. – richb01

+0

Вы должны использовать статический класс и члены, чтобы сохранить его значение. Или иначе вы будете сохранять текущее состояние в XML и загружать его каждый раз. –

+0

Вот страница, которая может вам помочь: https://msdn.microsoft.com/en-us/library/6c3yckfw.aspx. – richb01

ответ

-1
public static class global{ 
    public static int myInt = 0; 
} 
public class Form1{ 
    global.myInt = 10; 
} 
public class Form2{ 
     Console.WriteLine(global.myInt.ToString()); 
} 
+0

Дамп кода не помогает. Пожалуйста, объясните, как ваш код здесь применяется к вопросу? Игнорируя на мгновение, что глобальные переменные относятся к худшему способу взаимодействия объектов друг с другом, как глобальная переменная, которую вы предлагаете, исправить проблему, описанную OP? –

1

В коде есть ряд вещей, которые можно улучшить. Но основная проблема заключается в том, что при создании класса Login в вашем методе loginToolStripMenuItem_Click() этот новый экземпляр Login также создает новый экземпляр Class1 и использует это вместо экземпляра, о котором знает ваш Form1. Поэтому, когда Login изменяет значение пользователя, оно меняет его в местоположении, о котором Form1 ничего не знает.

Самое простое исправление ИМХО иметь Form1 просто передать Class1 ссылку на Login для того, чтобы использовать, вместо того, чтобы Login создать свой собственный экземпляр. Например:

public partial class Login : Form { 
    // ... 

    readonly Class1 md; 
    public Login(Class1 md) { 
     InitializeComponent(); 
     this.md = md; 
    } 

    // ... 
} 

И в Form1:

private void loginToolStripMenuItem_Click(object sender, EventArgs e) { 
    Login login = new Login(md); 
    login.MdiParent = this; 
    login.enbctrs += new ShowFrm(enablecrts); 
    login.disctrs += new ShowFrm(disablecrts); 
    login.Show(); 
} 

Затем, когда Login изменяет пользователя и вызывает событие, оно будет изменено значение в том же экземпляре Form1 используется, и поэтому Form1 будет получить желаемое значение в своем собственном коде.

Смежные вопросы