2012-01-06 11 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

2番目に関するいくつかのより多くの情報を提供してください。クラスとフォームの使用方法FtpFileSystemWatcherTSクラスで作成したフォームを表示していますか、またはフォームのインスタンスが複数存在していますか? – MatthiasG

+0

textBox1は更新されますか? Visual Studioデバッガからコードを実行すると、出力ウィンドウにエラーメッセージが表示されますか? – dgvid

+0

リストボックスに2つの項目しか追加していないので、BeginUpdateとEndUpdateを呼び出す必要はありません。 – evasilchenko

答えて

2

Formを他のクラスから作成しています。Formの子に対して行った変更は、表示されている別のフォームであるため表示されません。代わりにFtpFileSystemWatcherクラスに実行中のFormインスタンスを渡して、Form.Controlsプロパティにアクセスできるようにするか、ListBoxまたはListBoxアイテムのソースに直接アクセスできるようにする必要があります。

EDIT

提案:

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

これは、あなたが実行しているFormからFtpFileSystemWatcherアクセスを提供するために使用できるいくつかのコード形式のほんの一例です。これは、Formが実行されているときにセットアップされます(正しく動作していると仮定します)。その後、必要な更新が表示されます。

+0

"Modifiers"リストボックスをpublicに設定しました、またはリストボックスに直接アクセスする他の方法ですか? – XandrUu

+0

それはそれに直接アクセスする必要がありますが、それは問題ではありません。 (私が見ることのできる)例の問題は、実行中の 'Form'ではない' Form'の値を更新しようとしていることです。 –

+0

どうすればいいですか? – XandrUu

0

プロシージャのアクセス修飾子が

公共メインクラス(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.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 を2番目のクラスの名前の後に使用すると、親クラスのメソッドとプロパティにアクセスできるようになります。実際のリストボックスではなく実際のリストボックスを実際に更新するときに注意してください。 – user1120193

+0

リストボックスをパラメータとして2番目のクラスに渡し、2番目のクラスの項目を追加する方法もあります。実際には実際のものを更新します。 – user1120193

関連する問題