2016-04-27 4 views
0

У меня есть две формы окон. Один из них имеет переменную. В этой форме я создал метод GET:C# Как получить переменную в другую форму

public string getUSERID 
{ 
    get 
    { 
     return userID; 
    } 
} 

Во второй форме, я пытаюсь использовать этот метод следующим образом:

private void Form2_Load(object sender, EventArgs e) 
{ 
    UserID = Form1.getUSERID(); 
} 

По причинам, я не понимаю, второй форма не распознает getUSERID как жизнеспособный метод для Form1, и я понятия не имею, почему. Я искал форумы, и ответ, который я продолжаю находить, - это именно то, что я сделал: создайте метод «get/set» и активируйте его с помощью FormX.get/set.

Есть ли что-нибудь, что я делаю неправильно здесь?

EDIT: для калибровки. Форма 1 - это первая форма, которая открывается. В то время как она открыта, я открываю форму 2 внутри формы 1 так:

Form Form2 = new Form2(); 
          Form2.Show(); 
          conn.Close(); 
          Hide(); 

(Соединение, потому что форма 1 не используется соединение до сих пор). Теперь, когда я открываю Form2 перед тем, как скрыть Form1, я думал, что данные в Form1 все равно будут доступны во время FormLoad Form2, поэтому я могу извлечь из него переменную, а затем закрыть Form1.

+0

Подумайте об этом: инициализируется 'Form1'? 'Form1' - это имя класса, вы должны создать его как' Form1 frm = new Form1(); '. После этого вы можете получить доступ к 'frm.getUSERID' – Pikoh

+0

. Вы пытаетесь получить доступ к свойству экземпляра через класс. –

+0

Во всяком случае, я думаю, у вас есть еще одна большая проблема. Попытка прочитать свойство 'Form1' в событии' Load' 'Form2' означает ошибку дизайна. Может быть, вы должны отредактировать свой вопрос и сообщить нам, что вы пытаетесь сделать, например. передача свойства формы в другую форму, создаваемую третьей формой. – Pikoh

ответ

2

После того, как вы уточните, что бы я сделал, так это. В Form2 создать конструктор параметров, например:

string form1UserId=""; 
public Form2(string UserID) 
{ 
    InitializeComponent(); 
    this.form1UserId=UserID; 
} 

А потом, из Form1 вы просто должны это сделать:

Form2 frm2 = new Form2(userID); 
frm2.Show(); 
conn.Close(); 
Hide(); 

Надеется, что это помогает.

+0

Он делает, но Form - встроенный класс Visual Studio. Как изменить его так, чтобы он имел конструктор, содержащий переменную? –

+0

@NimrodYanai Ваша форма2 'Inherites' из' Form'. Таким образом, вы можете переопределить свои методы, например. Но это не то же самое, Form2 - ваш класс, и вы можете добавить к нему конструкторы – Pikoh

+0

i.e, когда я пытаюсь сделать то, что вы написали, он дает мне сообщение об ошибке, что Form не содержит конструктор, который получает переменную. –

0

Вы определили его как свойство, а не метод, поэтому no() не требуется.

Кроме того, для доступа к нему без создания экземпляра (new Form1()) он должен быть статичным.

0

вторая форма не признает getUSERID как жизнеспособный метод

Это потому, что это не метод, это свойство. Опустите парнеры, и вы обнаружите, что это работает.

+0

Это тоже не работает: \ Теперь у него есть красная строка под ALL инструкции, а не только имя свойства –

2

Здесь две вещи. Во-первых, вы определяете getUSERID как свойство, но пытаетесь получить к нему доступ, как метод. Во-вторых, вы определяете getUSERID как нестатический метод, но пытаетесь использовать его как статический метод. Чтобы исправить первую проблему, переименуйте getUSERID в USERID в объявление свойства и получите доступ к нему без круглых скобок (т. Е. someForm.USERID). Чтобы устранить вторую проблему, вам необходимо получить доступ к USERID свойства из экземпляра из Form1, а не в качестве статического члена в классе Form1, например, так:

Form2.cs

private Form1 _f1; 
public Form2(Form1 f1): Form2() 
{ 
    _f1 = f1; 
} 
// ... 
private void Form2_Load(object sender, EventArgs e) 
{ 
    UserID = _f1.USERID; 
} 
+0

Как я прокомментировал вопрос OP, это выглядит немного глупо, поскольку newForm.getUSERID, вероятно, будет пустым, если он не инициализирован в конструкторе Form1. – Pikoh

+0

@Pikoh, да, я подумал о том, чтобы поставить комментарий между двумя строками, говоря что-то вроде «показать форму и т. д.», чтобы указать, что я не показывал полный код, необходимый для того, чтобы сделать использование значимым. Предположим, что я сделаю это сейчас. – adv12

+0

Проблема в том, что Form1 является первой фирмой и уже открыт, и переменная, о которой идет речь, заполняется из базы данных SQL несколькими строками до того, как я открою Form 2. Поэтому открытие экземпляра Form1 из Form2 мне не поможет, потому что Form1 не подключен автоматически к th e. Чтобы быть ясным - Form1 - это небольшое окно, которое проверяет имя пользователя и пароль с базой данных, затем заполняет переменную «userID», принадлежащую указанному пользователю, затем открывает Form2, который должен принимать идентификатор пользователя, затем Form1 должен закрываться, откладывание только форма2. –

0

Здесь в вашем случае getUSERID - свойство только для чтения типа string, которое вернет userID этого класса. И еще одно замечание заключается в том, что свойство не определено как static, поэтому для доступа к значению свойства требуется ссылка на объект; поэтому подпись загрузки страницы будет

private void Form2_Load(object sender, EventArgs e) 
{ 
    Form1 newForm1= new Form1(); 
    UserID = newForm1.getUSERID; // UserID will be same as that of Form1's userID 
} 

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

public class Form1 
{ 
    private static string _UserId = "Some value"; 

    public static string UserId 
    { 
     get { return _UserId; } 
    } 
    // rest of statements 
} 

Так что вы можете получить доступ к UserId от любых других форм с помощью Form1.UserId нет необходимости создавать экземпляр Form1

+0

Я не могу использовать статическую переменную, так как Form1 получает эту переменную из базы данных, и она изменяется в зависимости от того, кто является пользователем (определяется именем пользователя и паролем). –

0

Просто дайте второй сформировать переменную при ее открытии, например, так:

SecondForm f2 = new SecondForm(YourVariable); 
    f2.Show(); 


    //Global Variable 
    var SaveVariableFromForm1; 

    protected override void OnCreate(var YourVariable) 
    { 
     //Imagine this is the Form2 OnCreate(); 
     SaveVariableFromForm1 = YourVariable; 
    } 

и поймать переменную на OnCreate метод в 2º Form по сохранить его в глобальной переменной и использовать его когда-либо вы чувствуете, как это, надеюсь, это поможет.

+0

Интересно. Можете ли вы привести пример?Я никогда не видел открытую форму с переменной, открытой на этом открытии. –

+0

Проверьте новый код. –

0
public **static** string getUSERID 
    { 
    get 
     { 
     return userID; 
     } 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     UserID = Form1.getUSERID(); // If the property has static it's possible to write like this. 
    } 



    (or) 



    public string getUSERID 
    { 
    get 
     { 
     return userID; 
     } 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     Form1 f= new Form1(); 
     UserID = f.getUSERID(); 
    } 
+0

Когда я пытаюсь сделать свойство static, он отказывается возвращать переменную, давая следующее сообщение об ошибке: «Ссылка на объект требуется для нестатического поля, метода или свойства« Form1.UserID » –