C# - 跟踪打开的子表单

时间:2010-12-31 00:46:27

标签: c# winforms

我目前有一个父控件(Form1)和一个子控件(Form2)。

Form1包含一个列表视图,用于存储文件数据列表(每个文件都是一个单独的项目)。

Form2仅包含一个文本框。

在Form1中单击其中一个listviewitems后,将打开Form2并访问该文件的数据并以纯文本格式将其加载到Form2的文本框中。

我遇到的问题是,我希望能够在点击listviewitem时检测到该文件是否已在所述子表单中打开,如果是,则激活它(将其置于前面)如果尚未打开,请打开它。我不确定这样做的最佳方法是什么,因为这可能涉及许多子表格同时打开。这不是MDI应用程序。关于如何实现这一点的任何想法都值得赞赏,样品更是如此。谢谢。

3 个答案:

答案 0 :(得分:3)

我过去所做的是为每个新表单添加一个唯一标记(基于您在这种情况下查看的文件),所以:

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();

只能为每个文件打开一个表单(或真正标记)

希望这有帮助!

答案 1 :(得分:2)

您可以简单地维护Dictionary<ListViewItem,Form>。每次打开新表单时,都会在字典中添加一个条目。如果字典已经包含被单击作为键的ListViewItem,那么您不需要打开新表单。

答案 2 :(得分:0)

假设为每个选定的项目创建了表单,您可以跟踪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的表单之间创建和切换,只需用文件内容填充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;
  }
}