C # - отслеживать открытые дочерние формы - PullRequest
1 голос
/ 31 декабря 2010

В настоящее время у меня есть родительский элемент управления (Form1) и дочерний элемент управления (Form2).

Form1 содержит просмотр списка, в котором хранится список данных файла (каждый файл является отдельным элементом).

Form2 содержит только текстовое поле.

При нажатии на один из этих элементов списка в форме Form1 открывается форма Form2, которая получает доступ к данным файла и загружает их в текстовое поле в форме Form2 в текстовом формате.

Проблема, с которой я столкнулся, заключается в том, что я хотел бы иметь возможность при щелчке по элементу списка просмотреть, был ли этот файл уже открыт в указанной дочерней форме и, если да, активировать его (перенести его на передний план) и если он еще не открыт, откройте его. Я не уверен, каким будет лучший способ сделать это, так как это может включать в себя открытие сразу нескольких дочерних форм. Это не приложение MDI. Любые идеи о том, как это может быть достигнуто, ценятся, а образцы - тем более. Спасибо.

Ответы [ 3 ]

3 голосов
/ 31 декабря 2010

Что я делал в прошлом, так это назначал каждой новой форме уникальный тег (в зависимости от файла, который вы просматриваете в этом случае), поэтому:

var form = new Form2();
form.Tag = (object)"My Unique Object as a Tag"; // Redundant cast I know, but shows Tag is of type object

Затем, когда вы собираетесь открытьокно для файла, итерируйте по всем открытым формам, проверяя теги следующим образом:

foreach(var f in Application.OpenForms)
{
   if(f.Tag == tagForFile)
   {
       f.BringToFront();
       return;
   }
}
// Couldn't find one, so open on
var form = new Form2();
form.Tag = tagForFile;
form.Show();

И это должно открывать только одну форму на файл (или действительно тег)

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

2 голосов
/ 31 декабря 2010

Вы можете просто поддерживать Dictionary<ListViewItem,Form>.Каждый раз, когда вы открываете новую форму, добавляйте запись в словарь.Если словарь уже содержит ListViewItem, который был выбран в качестве ключа, вам не нужно открывать новую форму.

0 голосов
/ 31 декабря 2010

Предполагая, что для каждого выбранного элемента создается форма, вы можете отслеживать открытые формы в теге ListViewItem.

lv.ItemSelectionChanged += lv_ItemSelectionChanged;

private void lv_ItemSelectionChanged(Object sender, ListViewItemSelectionChangedEventArgs e)
{
  if(e.IsSelected)
  {
    if(e.Item.Tag == null)
    {
      var form = new Form2();
      // init Form2 here
      form.Parent = this.panel1;
      e.Item.Tag = form;
    }
    (e.Item as Form2).BringToFront();
  }
}

EDIT: С другой стороны, зачем вам создавать и переключаться между формами, которые имеют только один Edit, было бы намного проще просто заполнить TextBox содержимым файла:

ListView1.ItemActivate += ListView1_ItemActivate;

private void ListView1_ItemActivate(Object sender, EventArgs e)
{
  if(ListView1.SelectedItems.Count > 0)
  {
    this.form2Instance.ContentsTextBox.Text = File.ReadAllText(this.rootFilesPath + @"\" + ListView1.SelectedItems.Last().Text));
  }
}

И если вы хотите прочитать содержимое файла только один раз, просто сохраните содержимое файла в теге ListViewItem

ListView1.ItemActivate += ListView1_ItemActivate;
private void ListView1_ItemActivate(Object sender, EventArgs e)
{
  if(ListView1.SelectedItems.Count > 0)
  {
    var item = ListView1.SelectedItems.Last();
    if(item.Tag == null)
      item.Tag = File.ReadAllText(this.rootFilesPath + @"\" + item.Text);
    this.form2Instance.ContentsTextBox.Text = (string) item.Tag;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...