Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
23 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 66
1

Не удается обращение к элементам и методам формы из другой формы

04.07.2013, 11:39. Показов 2957. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день,
Создал 2 формы, на второй есть паблик метод, элемент и несколько переменных, доступа к которым почему-то нет...
С переменными как-то ещё справлялся, сделав их статическими (ибо 1 форма), а вот статический элемент уже не подходит.
Скажите, что я сделал не так???

Form3.cs (Здесь то, к чему мне нужен доступ)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace WindowsFormsApplication2
{
    public partial class Form3 : Form
    {
        public static int optionIndex;
        public void boxChanging()
        {
            switch (optionIndex)
            {
                case (1): comboBox2.SelectedItem = 1;
                    break;
                case (2): comboBox2.SelectedItem = 2;
                    break;
                case (3): comboBox2.SelectedItem = 3;
                    break;
                case (4): comboBox2.SelectedItem = 4;
                    break;
                case (5): comboBox2.SelectedItem = 5;
                    break;
            }
        }
        public Form3()
        {
            InitializeComponent();
            this.CenterToScreen();
        }
    }
}
Form3.Designer.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
namespace WindowsFormsApplication2
{
    partial class Form3
    {
        private System.ComponentModel.IContainer components = null;
 
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Windows Form Designer generated code
 
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form3));
            this.comboBox2 = new System.Windows.Forms.ComboBox();
            this.SuspendLayout();
            // 
            // comboBox2
            // 
            this.comboBox2.FormattingEnabled = true;
            this.comboBox2.Items.AddRange(new object[] {
            "1",
            "2",
            "3",
            "4",
            "5"});
            this.comboBox2.Location = new System.Drawing.Point(27, 12);
            this.comboBox2.Name = "comboBox2";
            this.comboBox2.Size = new System.Drawing.Size(583, 21);
            this.comboBox2.TabIndex = 0;
            // 
            // Form3
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
            this.ClientSize = new System.Drawing.Size(699, 460);
            this.Controls.Add(this.comboBox2);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.Name = "Form3";
            this.Text = "Form3";
            this.ResumeLayout(false);
 
        }
 
        #endregion
 
        public System.Windows.Forms.ComboBox comboBox2;
    }
}
Form1.cs (Отсюда идет обращение с ошибкой)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Form wordForm1 = new Form3();
            wordForm1.Show();
            switch (optionIndex)
            {
                case (0): wordForm1.comboBox2.SelectedItem = 0;
                    break;
                case (1): wordForm1.comboBox2.SelectedItem = 1;
                    break;
                case (2): wordForm1.comboBox2.SelectedItem = 2;
                    break;
                case (3): wordForm1.comboBox2.SelectedItem = 3;
                    break;
                case (4): wordForm1.comboBox2.SelectedItem = 4;
                    break;
            }
ComboBox2 не находит. Также не находит паблик методы и переменные экземпляров формы.

Заранее благодарен за ваш опыт и время.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2013, 11:39
Ответы с готовыми решениями:

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

Обращение к элементам управления другой формы
Добрый день!Нужно чтобы чекбокс из 32й формы отключил чекбокс из родительской 1й.Как так сделать...

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

Обращение из родительской формы к элементам второй формы
Помогите пожалуйста, надо динамически вывести dataGridView с таблицами данных из БД на дочернюю...

9
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 11:55 2
Stalin45, почитайте:
Ответы на 7 самых частых вопросов по WinForms
если останутся вопросы, задавайте.
1
23 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 66
04.07.2013, 13:07  [ТС] 3
Psilon, спасибо за ответ, но я это уже читал и вообще потратил много времени на изучение этого вопроса перед тем как создать тему.
Там приводится 7 способов решения по данному пункту:
1. Я изменил модификатор доступа, но не могу все равно обратить к составляющим, которые мне нужны.
2. Ни к переменным, ни к методам, ни к элементам доступ не появился, хотя везде паблик...
3. Передача данных в конструктор не подходит, поскольку необходимо передавать данные уже после инициализации экземпляра формы.
4. Опять же здесь данные будут передаваться при инициализации, это раз, а во-вторых, опять же публичные методы остаются невидимыми. В общем, на практике не помогло
5. И снова реализация ничего не дала. Открытые методы не видит. А вот тут вопрос, а зачем нам вообще устанавливать родителя, если методы публичные??? Я так понимаю, это дало бы доступ к protected, но а здесь зачем?
6. Через статический гет, сет неплохо управлять переменными, но нельзя вызвать метод...
7. Очень сильно заболела голова, извините, пока не разобрался с делегатами.

Я понимаю, что я точно ошибаюсь по многим пунктам и что-то упускаю, поэтому просьба каменьями не побивать меня. Очень хочу реализовать вторым пунктом. Буду очень благодарен за разъяснение.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 13:18 4
Stalin45, а что вы собственно сделать пытаетесь?
0
23 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 66
04.07.2013, 13:45  [ТС] 5
Psilon, а вот смотрите, я в Form1.cs (это последний кусок кода в первом сообщении) описал несколько обращений к публичному элементу экземпляра Form3. Вот только элементы он эти не видит...До этого обращался к публичному методу из Form3.cs, опять же не видит...
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 14:03 6
Stalin45, еще раз: то, что вы делаете я вижу из кода Мой вопрос: что вы хотите в итоге получить?
0
23 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 66
04.07.2013, 14:16  [ТС] 7
Psilon, извините
В итоге хочу, чтобы после отображения Form3 в комбобоксе выбиралась та строка автоматически, номер которой зависит от переменной в Form1.
Вначале пытался реализовать это внутри события Shown Form3, но код там транслируется до показа самой формы и в результате ничего не меняется.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 14:30 8
Stalin45, пусть имеем две формы, в одной у нас есть кнопка и текстовое поле, куда вводим число, на второй - комбобокс. Нам требуется, чтобы в комбобоксе выделялась строка, индекс которой написан в текстбоксе. Тогда это можно сделать так:
в форме 2 (с комбобоксом) пишем
C#
1
2
3
4
5
        public void SelectAnother(int index)
        {
            if (index >= 0 && index < comboBox1.Items.Count)
                comboBox1.SelectedIndex = index;
        }
в первой форме обработчик кнопки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private void button1_Click(object sender, EventArgs e)
        {
            var f2 = new Form2();
            textBox1.TextChanged += (o, args) =>
                {
                    int result;
                    if (!int.TryParse(((TextBox) o).Text, out result))
                        result = -1;
                    f2.SelectAnother(result);
                };
            f2.Show();
        }
Добавлено через 13 секунд
Если не получится, скину проект.
1
23 / 2 / 0
Регистрация: 24.04.2011
Сообщений: 66
04.07.2013, 14:41  [ТС] 9
Psilon, спасибо вам большое, все получилось, я очень благодарен!
Но, эм, проблема была в следующем...
А чем строка:
C#
1
Form wordForm1 = new Form3();
отличается от:
C#
1
var wordForm1 = new Form3();
Которая открыла мне доступ ко всем публичным методам.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.07.2013, 15:55 10
Stalin45,
C#
1
var wordForm1 = new Form3();
это то же самое, что
C#
1
Form3 wordForm1 = new Form3();
найдите одно отличие между тем, что у вас было, и этим И попробуйте подумать, почему так получается (подсказка - смотрим, что такое наследование и как мы определяем форму)
0
04.07.2013, 15:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2013, 15:55
Помогаю со студенческими работами здесь

Обращение к элементам формы из класса
Как из класса test.cs присвоить значение textbox1 из формы Form1?

Обращение к одинотипным элементам формы
Есть массив значений (в настоящее время их 6, но может быть больше), каждое из которых можно...

Обращение из класса к элементам формы
Добрый вечер, подскажите пожалуйста, как из класса обратиться к элементам формы(image, label и ...

Обращение к элементам формы из завершающегося потока
Есть такая задача. В программу приходят данные по интерфейсу UART. За чтение отвечает дополнительно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru