2013-05-11 3 views
4

Это приложение предложит вам открыть папку. Затем приложение просматривает все файлы в папке и генерирует кнопку для каждого (.wav) файла. Мое намерение состояло в том, чтобы воспроизвести файл (.wav) при нажатии кнопки.Возможно ли иметь несколько кнопок управления. Tag

Как бы то ни было, я динамически создаю кнопки. Я использую button.Tag для отправки номера кнопки, однако я хочу отправить другой объект, который содержит полный путь к wav-файлу. Однако я добавил его, но знаю, что вы не можете добавить два button.Tag, как я это сделал. Поэтому мой вопрос заключается в том, как это реализовать.

public partial class Form1 : Form 
{ 
    public SoundPlayer Sound1; 
    public static int btnCount = 0; 

    public Form1() 
    { 
     InitializeComponent(); 
     SetFolderPath(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    public void addDynamicButton(string folder, string fileName) 
    { 
     btnCount++; 
     string soundfilepath = folder + "\\" + fileName + ".wav"; 

     Button button = new Button(); 
     button.Location = new Point(20, 30 * btnCount + 10); 
     button.Size = new Size(300, 23); 

     button.Text = fileName; 
     button.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 
     button.UseVisualStyleBackColor = true; 

     button.Click += new EventHandler(btnDynClickEvent); 
     button.Tag = btnCount; 
     button.Tag = soundfilepath; 
     this.Controls.Add(button); 

    } 

    void btnDynClickEvent(object sender, EventArgs e) 
    { 
     Button button = sender as Button; 
     if (button != null) 
     { 

      switch ((int)button.Tag) 
      { 
       case 1: 
        Sound1 = new SoundPlayer((string)button.Tag); 
       Sound1.Play(); 
       break; 

      } 
     } 
    } 

    public void SetFolderPath() 
    { 

     FolderBrowserDialog folder = new FolderBrowserDialog(); 

     folder.Description = "Select the sound file Folder"; 

     if (textBox1.Text.Length > 2) 
     { 
      folder.SelectedPath = textBox1.Text; 
     } 

     else 
     { 
      folder.SelectedPath = @"C:\"; 
     } 

     if (folder.ShowDialog() == DialogResult.OK) 
     { 
      textBox1.Text = folder.SelectedPath; 

      string[] files = Directory.GetFiles(folder.SelectedPath, "*.wav", SearchOption.AllDirectories); 
      int count = files.Length; 

      richTextBox1.Text = count.ToString() + " Files Found"; 

      foreach (string file in files) 
      { 
       string fileName = Path.GetFileNameWithoutExtension(file); 
       addDynamicButton(folder.SelectedPath, fileName); 
      } 
     } 
    } 


    private void btnOpenFolder(object sender, EventArgs e) 
    { 
     SetFolderPath(); 
    } 


} 
+1

Объявить класс ** ExtraButtonInfo **, содержащий ** все ** дополнительную информацию, необходимую для каждой кнопки, и присвоить экземпляры ** ExtraButtonInfo ** каждому свойству тега Button. –

ответ

3

Я рекомендую специализированный объект для хранения в Tag собственности:

class WaveDetailTag { 

    public FileInfo WaveFile {get; set;} 
    public int ButtonId {get; set;} 

} 

реализации:

// ... 
button.Tag = new WaveDetailTag() { 
    WaveFile = new FileInfo(soundfilepath), 
    ButtonId = btnCount 
}; 
// ... 

Update
Использование в switch-case:

Button button = sender as Button; 
    if (button != null) 
    { 
     var waveDetail = (WaveDetailTag)button.Tag; 
     switch (waveDetail.ButtonId) 
     { 
      case 1: 
       Sound1 = new SoundPlayer(waveDetail.WaveFile.FullName); 
       Sound1.Play(); 
       break; 
     } 
    } 
+0

+1 См. Мой комментарий выше (немного) о том, как это сделать. –

+0

@IAbstract Как я могу использовать его в корпусе коммутатора? –

+0

Большое вам спасибо, это отлично работает! –

0

Несколько тегов не представляется возможным, но вы можете использовать List (List<object> или List<MyType>) или массив в качестве Tag.

Вы также можете создать свой собственный класс, чтобы содержать все требуемые данные, которые были бы предпочтительнее:

class MyTagInfo 
{ 
    public int Num; 
    public string Text; 
    public bool SomeMoreInfo; 
} 

и использование:

myControl.Tag = new MyTagInfo { Num = 0, Text = "Hello World!" }; 
+0

Спасибо вашему вводу! –

0

Вы можете хранить список в собственность тегов, которые позволяет хранить в нем несколько объектов.

button.Tag = new List<object>(); 
(List<object> button.Tag).Add(btnCount); 
(List<object> button.Tag).Add(soundfilepath); 
+0

Неизвестный метод или расширение 'Tag' типа' object' с именем 'Add' или что-то в этом роде. Вы должны использовать 'Tag' для' List ', чтобы использовать его в качестве списка. – SimpleVar

+0

Тег - это «объект» и должен быть отлит перед добавлением чего-либо – IAbstract

+0

Спасибо за примечание. –

0

Используйте специальный класс и хранить его в Tag собственности, что-то вроде:

public class WaveButton 
{ 
    public int Number { get; set; } 
    public string WaveFilePath { get; set; } 
} 

..... 


button.Tag = new WaveButton() { Number = n, WaveFilePath = path } 
+0

Спасибо вашему вводу! –

1

вы должны установить Пометив как

button.Tag= new {Count = btnCount, FileName=soundFfilepath);//anonymouse type 

на когда вы хотите получить ваши ценности вы можете использовать динамический

int count=((dynamic)button.Tag).Count; 
string filename=((dynamic)button.Tag).FileName; 

или

int count=(int) button.Tag.GetType().GetProperty("Count").GetValue(obj, null); 
string filename= button.Tag.GetType().GetProperty("FileName").GetValue(obj, null).ToString(); 


вы можете также создать новый метод для второго решения

object GetValueByProperty(object obj,string propName) 
{ 
return obj.GetType().GetProperty(propName).GetValue(obj, null); 
} 

называть просто использовать

int count=(int) GetValueByProperty(button.Tag,"Count"); 
string filename=GetValueByProperty(button.Tag,"FileName");.ToString(); 
+0

Спасибо вашему вводу! –

+1

Спасибо, 4 ваша помощь. –

0

Я знаю его слишком поздно, но я придумал простой способ сделать это. просто присоединиться строки, как string join = String.join(","firstString,secondString); button.Tag = join; и перед использованием его просто разделить его на две строки, как этот

string[] split = join.Split(','); 
     string title = split[1]; 
     string link = split[0]; 

и использование строки заголовка и строки ссылку, как вам нравится. (Y) Я не знаю, является ли это хорошей практикой или нет, но я использую ее, и она работает идеально.

Я новичок в C#.

Смежные вопросы