2012-01-06 2 views
1

다른 클래스의 목록 상자에 항목을 추가하려고하는데 정보가 함수에 전달되지만 목록 상자가 업데이트되지 않는 것 같습니다.다른 클래스의 목록 상자에 항목을 추가 할 수 없습니다. C#

Main class (FORM) : 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    // the function that updates the listbox 
    public void logURI(string OutputLog, string Information, string JOB) 
    { 
     try 
     { 
      listBox1.BeginUpdate(); 
      listBox1.Items.Insert(0, DateTime.Now.ToString() + " : " + JOB + " " + Information); 
      listBox1.Items.Add("1"); 
      listBox1.EndUpdate(); 
      textBox1.Text = JOB; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 

두 번째 클래스 :

public class FtpFileSystemWatcherTS 
{ 
    Form1 logs = new Form1(); 
    logs.logURI("", "Found folder modefied today (" + FileName.TrimEnd(), ") ElectricaTS"); 
} 

내가 잘못하고있는 중이 이것이 내 코드?

+0

는 두 번째에 대한 좀 더 많은 정보를 제공하십시오 클래스와 폼의 사용법. FtpFileSystemWatcherTS 클래스에서 생성 한 폼을 표시하고 있습니까? 아니면 폼의 인스턴스가 둘 이상입니까? – MatthiasG

+0

textBox1이 업데이트됩니까? Visual Studio 디버거에서 코드를 실행하면 출력 창에 오류 메시지가 표시됩니까? – dgvid

+0

목록 상자에 2 개의 항목 만 추가하기 때문에 BeginUpdate 및 EndUpdate를 호출 할 필요가 없습니다. – evasilchenko

답변

2

Form을 다른 클래스에서 작성합니다. Form의 하위 변경 사항은 표시되는 다른 양식이므로 표시되지 않습니다. 대신 FtpFileSystemWatcher 클래스에 실행중인 Form 인스턴스를 전달하여 Form.Controls 속성에 액세스하거나 ListBox 또는 ListBox 항목의 소스에 직접 액세스 할 수 있도록합니다.

편집

제안 :

public partial class Form1 : Form 
{ 
    private FtpFileSystemWatcher mWatcher; 

    // ... some code ... 

    public Form1() 
    { 
     InitializeComponent(); 

     // Create a new watcher and give it access to this form 
     mWatcher = new FtpFileSystemWatcher(this); 
    } 

    // ... Logging code ... 
} 

public class FtpFileSystemWatcher 
{ 
    private Form1 mMainForm; 

    public FtpFileSystemWatcher(Form1 mainForm) 
    { 
     mMainForm = mainForm; 
    } 

    public void Log() 
    { 
     mMainForm.logUri(...); 
    } 
} 

이 당신이 실행 FormFtpFileSystemWatcher 액세스 권한을 부여하는 데 사용할 수있는 몇 가지 코드 형식의 단지 예입니다. 이것은 Form이 실행될 때 설정됩니다 (제대로 실행한다고 가정). 그러면 원하는 업데이트가 표시됩니다.

은 프로 시저의 액세스 수정 공공

Main 클래스 (FORM)로 설정 쉽게하기 때문에 상속을 사용할 수 있습니다

+0

"수정 자"목록 상자를 public으로 설정했습니다. , 아니면 목록 상자에 직접 액세스하는 다른 방법일까요? – XandrUu

+0

그러면 직접 액세스 할 수 있지만 문제는 아닙니다. 이 예제의 문제점 (내가 볼 수있는 것)은 실행중인 'Form'이 아닌 'Form'에서 값을 업데이트하려고한다는 것입니다. –

+0

어떻게 할 수 있습니까? – XandrUu

0

:

public partial class Form1 : Form 
{ 

    public Form1() 
    { 
     InitializeComponent(); 

    } 

    // the function that updates the listbox 
    public void logURI(string OutputLog, string Information, string JOB) 
    { 
     try 
     { 
      listBox1.BeginUpdate(); 
      listBox1.Items.Add("0"); 
      listBox1.Items[0] = DateTime.Now.ToString() + " : " + JOB + " " + Information; 
      listBox1.Items.Add("1"); 
      listBox1.EndUpdate(); 
      textBox1.Text = JOB; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

}

public class FtpFileSystemWatcherTS : Form1 
{ 
    logURI("", "Found folder modefied today (" + FileName.TrimEnd().toString(), ") ElectricaTS"); 
} 
+0

좋아, 나는 멍청한 녀석이다. 어떻게 상속을 사용할 수 있겠습니까? – XandrUu

+0

그냥 : Form1 두 번째 클래스의 이름 뒤에 사용하면 부모 클래스의 메서드와 속성에 액세스 할 수 있습니다. 실제로 복사하는 대신 실제 목록 상자를 실제로 업데이트하는 방식을 염두에 두어야합니다. – user1120193

+0

두 번째 클래스의 매개 변수로 목록 상자를 전달하고 두 번째 클래스의 항목을 추가 할 수있는 또 다른 방법이 있습니다. 실제적으로 업데이트 할 것입니다. – user1120193

관련 문제