2012-02-02 2 views
-1

저는 form1 안에 컨트롤을 추가하고 싶습니다. 에 대한 이벤트 처리기는 watcher.Changed + = new FileSystemEventHandler (OnChanged); 정의, 그것은 가능한 Form1에 예를 들어 목록 상자 컨트롤을 추가하지만이 당신을 찾고 무엇WinForm에서 이벤트가 발생하면 컨트롤을 추가하는 방법은 무엇입니까?

/*event added*/ 

    private void btn_start_Click(object sender, EventArgs e) 
    { 
     string[] args = {this.txtfolder.Text}; 
     if (args.Length != 1) 
     { 
      // Display the proper way to call the program. 
      Console.WriteLine("Usage: Invalid Operation"); 
      return; 
     } 

     FileSystemWatcher watcher = new FileSystemWatcher(); 
     watcher.Path = args[0]; 
     /* Watch for changes in LastAccess and LastWrite times, and 
      the renaming of files or directories. */ 
     watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
      | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
     // Only watch text files. 
     watcher.Filter = this.txtfilter.Text;//"*.txt"; 

     // Add event handlers. 
     watcher.Changed += new FileSystemEventHandler(OnChanged); 
     watcher.Created += new FileSystemEventHandler(OnChanged); 
     // watcher.Deleted += new FileSystemEventHandler(OnChanged); 
     watcher.Renamed += new RenamedEventHandler(OnRenamed); 



    // Define the event handlers. 
    private static void OnChanged(object source, FileSystemEventArgs e) 
    { 
     // Specify what is done when a file is changed, created, or deleted. 
     //Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType); 

     // Form1 F ;   
     // ListBox lst = new ListBox(); 
     //lst.Items.Add("File: " + e.FullPath + " " + e.ChangeType.ToString()); 
     //f.lsttracker.Items.Add("File: " + e.FullPath + " " + e.ChangeType.ToString()); 
     // F.controls.Add(lst); 
+2

예, 가능합니다. 그러나 이벤트가 발생할 때마다 추가 될 것입니다. 이는 원하는 내용이 아닐 수 있습니다. 코드가 보여주고있는 것을 말하기가 어렵습니다. 왜 그 모든 것들이 주석 처리 되었습니까? –

+0

시도해 보셨습니까? (주 : 가능한 질문이 보통 downvoted 끝나는가). –

+0

@selvannand이 샘플을 사용해보십시오. 나는 이것이 당신이하려는 일을한다고 생각합니다 : dl.dropbox.com/u/18919663/vs%20samples/TestingSandbox.zip – Corylulu

답변

1

정의 된 이벤트 핸들러 내부에 추가해야하는 것입니다. 당신이 주석 처리 한 것으로부터 아마도 위치와 크기를 설정하지 않았을 것이므로 컨트롤을 추가하는 것이 아마도 효과가 없었을 것입니다. 그러나 실제로 이것을 통제하고 원하는 때만 정확하게 컨트롤을 추가하는지 확인해야합니다. 아래의 코멘트에 언급 된 것에 대한 응답에서 :

private List<Control> AddedItems = new List<Controls>(); 
private int OffsetY = 0; 
private static void OnChanged(object source, FileSystemEventArgs e) 
{ 
    ListBox toAdd = new ListBox(); 
    if(AddedItem.Last().Point.Y == OffsetY) // just an example of reusing previously added items. 
    { 
     toAdd.Location = new Point(20, OffsetY); 
     toAdd.Size = new Size(200,200); 
     AddedItems.Add(toAdd); 
     this.Controls.Add(toAdd); 
    } 
    OffsetY += 200; 
} 

편집 : 당신은 당신이 추가 컨트롤을 저장하려면

private static void OnChanged(object source, FileSystemEventArgs e) 
{ 
    ListBox toAdd = new ListBox(); 
    toAdd.Location = new Point(20,20); 
    toAdd.Size = new Size(200,200); 
    this.Controls.Add(toAdd); 
} 

, 이런 일을하려고합니다.

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")] 
    private void btn_start_Click(object sender, EventArgs e) 
    { 
     string FolderPath = this.txtfolder.Text; 
     string Filter = this.txtfilter.Text; 
     if(!Directory.Exists(FolderPath)) 
     { 
      Console.WriteLine("Not a valid directory"); //checks directory is valid 
      return; 
     } 

     FileSystemWatcher watcher = new FileSystemWatcher(); 

     watcher.Path = FolderPath; 
     watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
           | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
     // Only watch filter files. 
     watcher.Filter = Filter; 

     watcher.IncludeSubdirectories = true; //monitor subdirectories? 
     watcher.EnableRaisingEvents = true; //allows for changed events to be fired. 

     // Add event handlers. 
     watcher.Changed += new FileSystemEventHandler(OnChanged); 
     watcher.Created += new FileSystemEventHandler(OnChanged); 
    } 
    //Delegate to get back to UI thread since OnChanged fires on non-UI thread. 
    private delegate void updateListbox(string context); 
    private void OnChanged(object source, FileSystemEventArgs e) 
    { 
     this.Invoke(new updateListbox(UpdateListbox), "File: " + e.Name); 
     this.Invoke(new updateListbox(UpdateListbox), ">>Action: " + e.ChangeType); 
     this.Invoke(new updateListbox(UpdateListbox), ">>Path: " + e.FullPath); 
    } 
    public void UpdateListbox(string context) 
    { 
     lsttracker.Items.Add(context); 
    } 
+0

안녕하세요, 설명 주셔서 감사합니다. 사실 저는 목록 상자에 값을 lsttracker에 form1에 추가해야합니다. , 이벤트 처리기를 발생시킬 때 아래와 같은 내용을 수행 할 것입니다 – selvaanand

+0

안녕, 설명 주셔서 감사하지만 사실 나는 lsttracker라는 이름의 목록 상자에 값을 추가해야합니다. 이벤트 처리기가 다음과 같은 것들을 수행합니다. 아래에 주어진 private static void OnChanged (Object source, FileSystemEventArgs e) { // 파일이 변경, 생성 또는 삭제 될 때 수행 할 작업을 지정합니다. File.Delete (e.FullPath); //이 다음에 값이나 파일의 경로를 form1의 lsttracker라는 목록 상자에 추가해야합니다. // 이것은 내가 필요한 것입니다. 아무도 모른다면 도와주세요 – selvaanand

+0

제 편집을 확인하십시오. 나는 그것이 당신이 찾고있는 것이라고 생각합니다. :] OnChange 이벤트 처리기를 정적으로 사용했기 때문에 문제가 발생했을 수 있습니다. 정적이 아닌 양식 요소를 참조 할 수는 없습니다. – Corylulu

관련 문제