2016-08-13 1 views
0

У меня есть приложение C#, которое позволяет пользователю регистрировать определенные события, которые происходят в игре. Для простоты я назову их ParentForm и ChildForm.C# Конкретное значение, передаваемое между формами без нового экземпляра

ParentForm используется 99% времени, чтобы регистрировать общие события. Это представлено как пользователь, нажимая PictureBox и свойство Tag того, что PictureBox добавлено в ListBox. Когда происходит «редкое» событие, пользователь может нажать кнопку «log редкое событие» на ParentForm, чтобы открыть ChildForm, который открывает набор «редких событий» PictureBoxes, которые функционируют так же, как и в ParentForm. Задача состоит в том, что я хочу, чтобы эти общие и редкие события, которые будут записываться в тот же ListBox, так что я пытаюсь выяснить, как я хотел бы получить PictureBox щелчок (и последующее Tag от этого PictureBox) на ChildForm к ListBox на ParentForm ,

ParentForm не делает не закрыт пока ChildForm открыт и должен оставаться открытым.

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

Вот что я пытался до сих пор для Родитель:

// This file is EventLogger.cs 
using rareEvent; 
namespace mainWindow { 
    public partial class EventLogger : Form { 
     // In the ParentForm (listeners for PictureBox clicks are handled elsewhere) 
     public void pictureBox_Click(object sender, EventArgs e) { 

      PictureBox pbSender = (PictureBox) sender; 

      // Open new window and handle "rare" drops 
      if (pbSender.Tag.ToString() == "rare") { 

       // Open rare form 
       EventLogger.RareForm rare = new EventLogger.RareForm(); 
       rare.Show(); 
      } 
     } 
    } 
} 

и вот ребенок:

// This file is Rare.cs 
using EventLogger; 
namespace rareEvent { 
    public partial class rareEventForm : Form { 

     // In the ChildForm 
     private void pictureBox_Click(object sender, EventArgs e) { 

      // Does not compile if form is not instantiated, but I do not 
      // want a new instance 
      EventLogger form; 
      form.pictureBox_Click(sender, e); 
     } 
    } 
} 

я понял, что-то вроде этого будет работать, но он дает ошибку

The type or namespace name 'EventLogger' does not exist in the namespace 
'mainWindow' (are you missing an assembly reference?) 

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

Цените это!

Редактировать: Код обновлен для того, чтобы иметь using <namespace> в каждом файле. Проблема по-прежнему заключается в невозможности отправки значений между обеими формами без с использованием new. (См. Комментарий к this ответ)

+0

Вы должны передать аргументы между двумя формами, используя экземпляры, но вам не нужно закрывать экземпляры. См. Проект в двух формах при следующей публикации. Многие люди используют этот код, который я разработал более 5 лет назад. Другие эксперты также рекомендовали мой код: https://msdn.microsoft.com/en-us/library/w89fhyex(v=vs.110).aspx. Я буду рад ответить на любые дополнительные вопросы. – jdweng

+0

Не уверен, что вы связали правильную вещь - эта ссылка идет на сокеты, и ничего не сказано о «проекте с двумя формами» – Sej

+0

Ваш правильный. Ссылка была ответом для другой публикации в TCP. Вот правильная ссылка: http://stackoverflow.com/questions/34975508/reach-control-from-another-page-asp-net – jdweng

ответ

1

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

//FORM1 
public partial class Form1 : Form 
{ 
    //Instance of this form 
    public static Form1 instance; 

    //For testing 
    public string myProperty = "TEST"; 

    //Assign instance to this either in the constructor on on load like this 
    public Form1() 
    { 

     InitializeComponent(); 
     instance = this; 
    } 
    //or 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     //Assign the instance to this class 
     instance = this; 
    } 

Тогда в форме2 при вызове EventLogger.RareForm редкий = новый EventLogger.Rareform(); вместо новой формы сделать

EventLogger.RareForm rare = EventLogger.RareForm.instance 

Или в моем случае

Form1 frm = Form1.instance; 

Затем я проверить свойство формы 1 FROM form2 как так

Console.WriteLine(frm.myProperty); 

Выход был "Тест"

Любые проблемы с криком.

+0

Отлично. «Экземпляр» был всем, что мне нужно. Огромное спасибо!! – Sej

+0

Удовольствие ответить на мой первый вопрос –

+0

Удивительно, что это здорово :) – Sej