2016-06-20 4 views
-1

Ich habe ein Form und ein Class: Form1 & TimerC# Eine Datei über einen Klick aufrufen?

In Form1 habe ich eine Schaltfläche, die

public void browseSoundToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    OpenFileDialog dialog1 = new OpenFileDialog(); 

    dialog1.Title = "Browse to find sound file to play"; 
    dialog1.InitialDirectory = @"c:\"; 
    dialog1.Filter = "Wav Files (*.wav)|*.wav"; 
    dialog1.FilterIndex = 2; 
    dialog1.RestoreDirectory = true; 

    //PlaySound(dialog1.FileName, new System.IntPtr(), PlaySoundFlags.SND_SYNC);    
} 

In Timer.cs so aussieht Ich habe eine Event die wie folgt aussieht:

public void alert_sound(object source, ElapsedEventArgs e) 
{ 
    MessageBox.Show("Alert Sound ding ding ding"); 

    //PlaySound(dialog1.FileName, new System.IntPtr(), Form1.PlaySoundFlags.SND_SYNC); 
    alert_timer.Stop(); 
} 

Das Problem ist, dass in Timer.cs sagt, dass dialog1 nicht im aktuellen Kontext vorhanden ist. Wie rufe ich Dialog 1 von Form1 in meine Timer Klasse auf?

Antwort

2

In Ihrem Beispiel muss dialog1 auf Modulebene deklariert werden. Sie haben es in der browseSoundToolStripMenuItem_Click() -Methode deklariert, sodass dialog1 nur einen Bereich für diese Methode enthält.

verschieben diese Zeile:

OpenFileDialog dialog1 = new OpenFileDialog(); 

zum oberen Rand des Formulars.

+0

Jetzt bekomme ich Form1.dialog1 ist aufgrund seiner Schutzstufe nicht zugänglich. Ist das so, weil es privat ist? 'public partially class Form1: Formular { OpenFileDialog dialog1 = neu OpenFileDialog();' So sieht der obere Teil meines Formulars jetzt aus – Havoux

+0

Ja. Ändern Sie es in öffentlich. –

2

Sie haben die Variable dialog1 in einer lokalen scope-Ereignismethode browseSoundToolStripMenuItem_Click erstellt. Um auf ein anderes Ereignis zuzugreifen, müssen Sie es auf Klassenebene erstellen. Wie folgt:

public partial class Form1 : Form 
{ 
    OpenFileDialog dialog1 = new OpenFileDialog(); 


    public void browseSoundToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     dialog1.Title = "Browse to find sound file to play"; 
     dialog1.InitialDirectory = @"c:\"; 
     dialog1.Filter = "Wav Files (*.wav)|*.wav"; 
     dialog1.FilterIndex = 2; 
     dialog1.RestoreDirectory = true; 

     //PlaySound(dialog1.FileName, new System.IntPtr(), PlaySoundFlags.SND_SYNC);    
    } 

    public void alert_sound(object source, ElapsedEventArgs e) 
    { 
     MessageBox.Show("Alert Sound ding ding ding"); 

     //PlaySound(dialog1.FileName, new System.IntPtr(), Form1.PlaySoundFlags.SND_SYNC); 
    alert_timer.Stop(); 
    } 

} 
+0

Ich sehe, ich dachte, die 'browseSoundToolStripMenuItem_Click' Methode öffentlich machen würde das Problem mit dem lokalen Bereich zu vermeiden. Ich habe es jetzt zu einer Klassen-Level-Variable gemacht, aber in 'alert_sound()' dialog1 ist aufgrund seines Schutzlevels nicht zugänglich. – Havoux

+0

Wirklich? Wenn dialog1 in der gleichen Klasse wie alert_sound() deklariert ist, sollte es keine Rolle spielen, ob beide als public oder private deklariert sind. Dies liegt daran, dass der Zugriffsmodifizierer (das öffentliche, geschützte oder private Schlüsselwort) nur für Code gilt, der von außerhalb des Klassenbereichs auf die Variable/Methode zugreift. –

1

müssen Sie den Dateinamen in einer Variablen speichern, die von der anderen Methode aufgerufen werden kann.

string filename = dialog1.Filename; 

Mögliche Dateinamen Variable als Klassenstufe Variable zu verwenden, aber das ist ein Vorschlag, wie ich nichts über die Klasse und das Layout kennen.

Verwandte Themen