Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Вопрос по C# Форма, методы и элементы

Сергей Власенко Ученик (64), открыт 2 недели назад
Добрый день.
Возникла такая проблема, не знаю даже с чем связанна, но уже "бьюсь" с ней много времени, но так и не приходит решение на ум.

1. C# WinForms.

2. Существуют 2 формы Form1 and Form2.

3. На Form1 лежит элемент ListBox, а так же в теле есть метод с уровнем доступа Public. В котором осуществляется вывод сообщений первое на MessageBox.Show, второе на ListBox.

4. Из Form2 мы получается запускаем метод который лежит на Form1 и по логике сообщения и на MessageBox.Show и на ListBox должны отобразится.
Но по факту MessageBox.Show отображает сообщение, а ListBox не хочет.
Код:

FORM 1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows .Forms;

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{

public Form1()
{
InitializeComponent();
}

public void TB1()
{
MessageBox.Show("");

listBox1.Items.Add("1");

listBox1.Items.Add("2");

}
private void Form1_Load(object sender, EventArgs e)
{

}

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


FORM 2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows .Forms;

namespace WindowsFormsApp1
{

public partial class Form2 : Form
{
Form1 fm = new Form1();
public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
fm.TB1();
}
}
}
4 ответа
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (243442) 2 недели назад
fm.TB1() надо вызывать на текущем экземпляре
Сергей ВласенкоУченик (64) 2 недели назад
А как его вызвать на Form2?
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (243442)
 public Form2(Form1 form1) // Добавляем параметр типа Form1 в конструктор Form2 
        { 
            InitializeComponent(); 
            fm = form1; // Присваиваем переданный экземпляр Form1 переменной fm 
        } 
Rivvender Профи (666) 2 недели назад
Вообще так лучше не делать, в плане создавать экземпляр формы внутри другой ради получения каких-то сообщений, для этого можно использовать синглтоны/классы с static методами/параметрами, что касается добавления в "ListBox1" чего либо, то этот самый ListBox1 под собой подразумевает ссылку на объект внутри Form1, поэтому вы не видите результат на Form2, если вы конечно пытаетесь добиться этого
Александр Просветленный (20739) 2 недели назад
Общение между двумя и больше формами лучше делать через события, чем проброс ссылок на форму в конструктор или что еще хуже, шарить контролы между формами. Что бы не плодить лишних событий, обычно создают класс, который будет управлять событиями. Этот класс является синглтоном. Внутри него будет какая-то коллекция, которая будет содержать инфу о подписчиков и внутри каждого элемента будет делегат. Так же внутри него будут методы - Publish, Subscribe, Unsubscribe. Subscribe и Unsubscribe нужны для подписки/отписки на событие. А вот в Publish мы передаем тему или тип события (это будет зависить от вашей реализации), находим в коллекции подписчиков с такой темой и вызываем у каждого делегат. Примеров такой реализации миллион. Например тут простая реализация - https://codereview.stackexchange.com/questions/236070/c-event-manager-without-allocations
Jurijus Zaksas Искусственный Интеллект (425757) 2 недели назад
>Form1 fm = new Form1();
ОК, экземпляр формы создан, а где ты его показываешь? Сдаеццо мне, что ты работаешь с разными формами.
Похожие вопросы