我目前有一个父控件(Form1)和一个子控件(Form2)。
Form1包含一个列表视图,用于存储文件数据列表(每个文件都是一个单独的项目)。
Form2仅包含一个文本框。
在Form1中单击其中一个listviewitems后,将打开Form2并访问该文件的数据并以纯文本格式将其加载到Form2的文本框中。
我遇到的问题是,我希望能够在点击listviewitem时检测到该文件是否已在所述子表单中打开,如果是,则激活它(将其置于前面)如果尚未打开,请打开它。我不确定这样做的最佳方法是什么,因为这可能涉及许多子表格同时打开。这不是MDI应用程序。关于如何实现这一点的任何想法都值得赞赏,样品更是如此。谢谢。
答案 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;
}
}