2013-08-17 3 views
0

Я хочу использовать ComboBox1, который находится в Form1 и отобразить его в MessageBox после нажатия кнопки в форме 2. В Form2 я использовал:Использование COMBOBOX из другой формы в C#

MessageBox.Show(Form.comboBox1.SelectedItem.ToString()); 

Я получаю сообщение об ошибке говорящее что comboBox1 недоступен из-за уровня защиты. Есть ли способ, которым я могу заставить его быть публичным? Я также попытался присвоить comboBox1.SelectedItem.ToString() строковой переменной в Form1 и использовать его в MessageBox в Form2, но он тоже не работает. Есть ли другой способ, которым я могу заставить это работать?

Вот остальная часть моего кода:

public Form1() 
    { 
     InitializeComponent(); 

     for (int i = 1; i <= 30; i++) 
     { 
      string[] numbers= { i.ToString() }; 
      comboBox1.Items.AddRange(numbers); 
     } 

    } 

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

Form2:

public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Form1 Form = new Form1(); 
     MessageBox.Show(Form.comboBox1.SelectedItem.ToString()); //Here is my error 
    } 
} 

}

ответ

0

Одним из способов было бы сделать это следующим образом:

Внутри Form1 вы создайте экземпляр Form2, как этот новый Form2(this), т.е. вы p чтобы определить Form1, и таким образом вы должны использовать любую общедоступную переменную/свойство Form1 в Form2.

Более предпочтительным способом было бы сохранить selecteditemForm1 в некотором global scope, откуда вы можете получить к нему доступ в Form2.

0

Вы можете сделать ComboBox свойство формы, как это:

public partial class Form1 : Form 
{ 
    public ComboBox Combo1 { get { return this.comboBox1; } } 
    ... 
} 

, а затем она будет работать. Тем не менее, вам придется немного изменить код, потому что вам нужно: 1) показать форму и 2) ComboBox не будет иметь ничего выбранного сразу, так что вы получите еще одно исключение, так что вы можете принудительно выделить выбор. Весь код будет выглядеть следующим образом:

private void button1_Click(object sender, EventArgs e) 
{ 

    Form1 Form = new Form1(); 
    Form.Show(); 
    Form.Combo1.SelectedIndex = 0; 
    MessageBox.Show(Form.Combo1.SelectedItem.ToString()); //Here is my error 
} 
+0

Но вы снова показываете Form1 из Form2, который может быть действительно запутанным. –

+0

Я не знаю, чего он пытается выполнить, но вот что он просит ... –

+0

Form.Combo1.SelectedIndex = 0; возвращает только первое значение combobox, а не выбранное значение. Есть ли способ исправить это? – Rin

0

Простой ответ: В конструкторе, каждый элемент управления имеет свойство Modifiers, где вы установили, если это private, public и т.д. Просто измените его, и он станет видимым вне вашей формы.

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

public partial class Form2 : Form 
{ 
    public Form1 ParentForm {get; set;} 

    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show(this.ParentForm.comboBox1.SelectedItem.ToString()); 
    } 
} 

В Form1:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 form = new Form2(); 
    form.ParentForm = this; 
    form.Show(); 
}