Приложение ListBox и WinForms - PullRequest
       1

Приложение ListBox и WinForms

0 голосов
/ 13 апреля 2011

У меня есть приложение windows form1. Эта форма1 имеет кнопку щелчка. Когда кнопка нажата, в методе click-button создаются некоторые обработчики событий. В методе обработчика события SendText я создаю и показываю вторую форму Form2, где я хочу напечатать строковое значение, встреченное в form1.

Проблема в том, что в моем ListBox я вижу только одну строку, а не все (я последовательно отправляю строки). Зачем? Кроме того, при поступлении нового обработчика событий дополнительные формы Form2 не создаются и не отображаются.

В Form1 я так называю form2:

public void Send(string body, string name)
{
    Form2 form2 = new Form2(body);
    form2.Text = name;
    form2.ShowDialog ();
} 

public  void OnMessage(first val, second vall)
{
    send(string val1, string va2);
}

Form2 содержит:

public Form2(string s)
{
    InitializeComponent();
    listBox1.Items.Add(s);
}

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

2 вопроса:

  1. Как я могу создавать несколько форм Form2 каждый раз, когда активируется обработчик (используя потоки, нет?)?

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

Пожалуйста, приведите примеры, если это возможно.

Спасибо.

Ответы [ 4 ]

1 голос
/ 13 апреля 2011

Вместо использования form2.ShowDialog(); вы можете использовать form2.Show();

Это работает, потому что Show () не работает, ShowDialog () является модальным.

Здесь это объяснение различий.

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

0 голосов
/ 13 апреля 2011

если я получил это право, вы хотите:

  • новую форму2 для каждого уникального параметра "имя" в Send (...)
  • все последующие вызовы Send (...) с тем же параметром "name" следует добавить строку в параметре "body" в тот же список в связанной форме2

что по этому поводу?

Dictionary<string,From2> myForm2s = new Dictionary<string,Form2>();

public void Send(string body, string name)
{
   Form2 frm = null;
   if(!myForm2s.tryGetValue(name,out frm))
   {
      frm = new Form2(body);
      myForm2s[name] = frm;
      frm.Text = name;
      frm.FormClosing += new FormClosingEventHandler(Form2_FormClosing);
      frm.Show();
   }
   else
   {
      frm.listBox1.Items.Add(body); // assuming listBox1 is public
      frm.Show();
      frm.BringToFront();
   }
}
void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
   e.Cancel = true;
   ((Form2)sender).Hide();
}

(код не проверен ...)

вы, возможно, захотите обработать событие FormClosing в Form2 ... отмените событие с помощью eventarg и вызовите this.Hide () ... так что Form2 все равно будетисчезает, если пользователь щелкает x, но форма все еще там, готовая к повторному показу, когда следующее событие добавляет что-то к нему ...

0 голосов
/ 13 апреля 2011

Используйте словарь для хранения открытой формы Form2, упорядоченной по имени:

private Dictionary<string, Form2> forms = new Dictionary<string, Form2>();

public void Send(string body, string name)
{
    if(forms.ContainsKey(name))
    {
        forms[name].AddNewItem(body);
    }
    else{
        Form2 form2 = new Form2(body);
        form2.Text = name;
        forms.Add(name, form2);  
        form2.ShowDialog();
    }
} 

И Form2 будет содержать:

public Form2(string s)
{
    InitializeComponent();
    listBox1.Items.Add(s);
}

public void AddNewItem(string s)
{
    listBox1.Items.Add(s);
}

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

Надеюсь, это поможет:)

0 голосов
/ 13 апреля 2011

попробуйте сделать вашу форму статичной

static Form2 form2;

public void Send(string body, string name)
{        
    form2 = new Form2(body);
    form2.Text = name;
    form2.ShowDialog();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...