2014-11-24 1 views
0

У меня есть приложение Windows C#, которое имеет две формы Form1, которая является основной формой и Form2. Form1 имеет на нем поле со списком, а Form2 - текстовое поле.Получить выбранную форму формы ComboBox Form1 в другую Form2

Я хочу поставить значение, выбранное в Form1.ComboBox1, в Form2.TextBox1.

Я пытаюсь это:

 Form1 Form1Object = new Form1(); 
     string fff = Form1Object.ComboBox1.SelectedItem.ToString(); //not working 
     TextBox1.Text = fff; 

Проблема заключается в том, что, когда я запускаю это Form1 переинициализируется и я не хочу этого. (У меня есть заставка, которая запускается при запуске приложения, поэтому, когда я запускаю свой код, заставка запускается снова заново.

Есть ли способ прочитать значение ComboBox1 без перезапуска первой формы? Если я попробую прямо не работает, он видит Form1, как Calss вместо объекта

Form1.ComboBox1.SelectedItem.ToString(); //does not work 

Я также пытаюсь добавить значение в текстовое поле при открытии второй формы:.

 Form2 form2 = new Form2(); 
     form2.TextBox1.Text = ComboBox1.SelectedValue.ToString(); 
     form2.Show(); 

Это дает мне следующее error: "Ссылка на объект не установлен в момент объекта «

EDIT:. Он работает, используя этот код:

 Form2 form2 = new Form2(); 
     form2.TextBox1.Text = ComboBox1.Text; 
     form2.Show(); 

Теперь еще остается мой вопрос: Если я нахожусь в Form2 может я до сих пор получить значение из Form1? Если нет, это нормально. Я опубликую это как решение.

+0

До тех пор, пока ваш «находится» в вашем классе Form1, вы можете использовать эту ссылку для текущего экземпляра. Таким образом, вы можете повторно использовать один и тот же экземпляр. – HimBromBeere

+0

Вы можете использовать событие. [Вот пример] (http://stackoverflow.com/a/6382869/754438). Но в вашем случае используйте combobox selected item changed event вместо textBox1_TextChanged в примере. – Reniuz

+0

«Объектная репликация не установлена ​​на мгновение объекта». означает, что SelectedValue в вашем ComboBox имеет значение NULL. Отлаживайте и проверяйте, что находится в свойствах SelectedValue, SelectedItem и SelectedIndex вашего поля со списком при этом исключении. – Arie

ответ

0

Этот вопрос задавался и отвечал много раз и в разных версиях.

Я хотел бы предложить, глядя на некоторые из следующих я писал в прошлом ...

This example показывает две формы, где вторая форма передается в качестве параметра экземпляра первой формы. Затем из открытых методов, открытых на первом, второй может вызвать их для получения значений. Это ваше усмотрение, если вы хотите разрешить настройку из альтернативного источника или просто разрешить метод get ... может быть сделано в качестве публичного доступа к свойствам; защищенный набор;

This stackoverflow search покажет несколько ссылок на сообщения, которые я делал в прошлом, со слегка изменяющимися версиями между различными формами.

МНЕНИЕ COMMENT

Там должно быть что-то сделать в вашей первой форме, чтобы вызвать вторые .. это от кнопки мыши, или на основе фактического выбора поля со списком изменяется. Как бы то ни было, первый пример, который я предоставил, ДОЛЖЕН быть тем, что вам нужно. У вас второй звонок второй формы.

Без полного копирования \ вставки первого примера, все, что вам нужно будет сделать, это действительно в форме 2-конструктор установить текст вытащил из первых ...

public Form2(Form1 viaParameters) : this() 
{ 
    this.textBox1.Text = viaParameters.Combobox1.SelectedItem; 
} 

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

if(viaParameters.Combobox1.SelectedIndex > -1) 
    this.textBox1.Text = viaParameters.Combobox1.Items[ viaParameters.Combobox1.SelectedIndex ].WhateverStringValue; 

Таким образом, начало формы 2 из формы 1 может захватить значение непосредственно.

Если вы подвергаете метод из первой формы через свойство или метод, текст значение может быть столь же просто, как

this.textBox1.Text = viaParameters.YourForm1sMethodToGetStringFromCombobox(); 
+0

Здравствуйте, я обыскал форумы и нашел примеры, но во всех примерах вторая форма была инициализирована как frm2, а из формы 1 - пользовательский доступ к frm2.object. Мне нужно было наоборот. Я не могу инициализировать Form1 как frm1, а затем использовать frm1 как объект начиная с Form1 или открывать первый раз, когда приложение запускается. – Danut

+0

@ Danut, просмотрите мой ответ для уточнения ... Также попробуйте сделать весь первый пример, чтобы увидеть, как все работает, а затем измените его по образцу со списком в соответствии с вашим сценарием. – DRapp

1

Хотя это не самый правильный ответ, это один из способов решить проблема.

Form1

Добавить способ получить значение

public string TransmitSelectedValue() 
    { 
    return ComboBox1.SelectedItem.ToString(); 
    } 

Form2

var myvalue = ((Form1)ParentForm.Controls.Find(Form1Name,true)).TransmitSelectedValue(); 
+0

Это не работает. Form1Name - Form1 в моем приложении, и когда я заменяю Form1Name Form1 в коде, я получаю ошибку. – Danut

+0

Имя вашего экземпляра Form1 при его создании - «Form1»? – DidIReallyWriteThat

+0

Да. Я оставил это нетронутым. Это форма приложения по умолчанию. Тот, который запускается при запуске приложения. – Danut

0

я не уверен, где проблема

при запуске/открытие form2

как

 Form2 f2 = new Form2(); 
     f2.Show(this); 

у вас есть ссылка на Form1, как «владелец»

на form2 вы можете просто поставить это на любом случае вы хотите или на кнопку или любой

 Form1 f1 = Owner as Form1; 
     textBox1.Text = f1.comboBox1.SelectedItem.ToString(); 

преобразуется в C# ...

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