2010-12-31 7 views
1

現在、親コントロール(Form1)と子コントロール(Form2)があります。C# - 開いている子フォームを追跡する

Form1には、ファイルデータのリストを格納するリストビューが含まれています(各ファイルは個別の項目です)。

Form2にはテキストボックスのみが含まれています。

Form1のこれらのリストビュー項目の1つをクリックすると、Form2が開き、ファイルのデータにアクセスし、Form2のテキストボックスにプレーンテキスト形式で読み込みます。

私が抱えている問題は、listviewitemをクリックすると、そのファイルがすでにその子フォームで開かれているかどうかを検出することができます。そうであれば、それをアクティブにします)まだ開かれていない場合は開きます。私は、これを行う最良の方法は、これが一度に開いている多くの子フォームを含む可能性があるため、どのような方法がよいかわからない。これはMDIアプリケーションではありません。これがどのように成し遂げられるかについてのアイデアは高く評価されています。ありがとうございました。私が過去にやっていること

答えて

2

ので、それぞれの新しいフォームに(あなたはこの場合には表示しているファイルに基づいて)固有のタグを与えることである。

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が含まれている場合は、新しいフォームを開く必要はありません。

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: 一方、あなたが作成し、唯一の編集を持つフォームを切り替えるなぜ、それだけでファイルの内容をテキストボックスを埋めるためにはるかに簡単になります:

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; 
    } 
} 
関連する問題