2016-04-26 20 views
-3

因此,我的問題可能會變得很簡單。我知道如何創建一個方法來從應用程序回調,但我的問題是試圖找出如何正確地做到這一點。我需要重複foreach循環:(foreach(Ticket t in events) if(t.getName()。Equals(cbEvents.SelectedItem.ToString())) { ) 並將其更改爲在代碼中調用兩次的方法。請幫忙。下面的代碼。將一個重複的foreach循環轉到一個方法,以便它只重複一次

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace TicketPurchasing 
{ 
public partial class Form1 : Form 
{ 
    private ArrayList events; 

    public Form1() 
    { 
     InitializeComponent(); 
     events = new ArrayList(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     //Create events 
     events.Add(new Game(12.00, "KSU vs UGA", "Convocation Building", "bball", "Basketball")); 
     events.Add(new Game(15.00, "KSU vs GSU", "Stadium", "fball", "Football")); 
     events.Add(new Concert(8.00, "Country Music", "Campus Green", "hayes", "Hunter Hayes")); 
     events.Add(new Concert(12.00, "Rock/Pop", "Campus Green", "m5", "Maroon5")); 

     //Load combobox 
     foreach (Ticket t in events) 
     { 
      cbEvents.Items.Add(t.getName()); 
     } 
    } 

    private void btnDetails_Click(object sender, EventArgs e) 
    { 
     //Get name of selected item from combobox 
     string eventName; 

     //Traverse array to determine the match 
     foreach (Ticket t in events) 
     { 
      if (t.getName().Equals(cbEvents.SelectedItem.ToString())) 
      { 
       //Display details 
       lblDetails.Text = t.getDetails(); 

       //Display image 
       displayImage(t.getFileName()); 
      } 
     } 
    } 

    private void displayImage(string file) 
    { 
     Size size = new Size(173, 180); 
     Image img = (Image)Properties.Resources.ResourceManager.GetObject(file); 
     img = (Image)(new Bitmap(img, size)); 
     pbImage.Image = img; 
     pbImage.Refresh(); 
     pbImage.Visible = true; 
    } 

    private void txtTickets_TextChanged(object sender, EventArgs e) 
    { 
     //Get number of tickets 

     int num = int.Parse(txtTickets.Text); 

     double ticketCost = 0; 

     //Get cost of ticket 
     foreach (Ticket t in events) 
     { 
      if (t.getName().Equals(cbEvents.SelectedItem.ToString())) 
      { 
       ticketCost = t.getCost(); 
      } 
     } 

     //Calculate cost 
     double total = num * ticketCost; 

     //Display cost 
     txtCost.Text = total.ToString("c"); 
    } 

    private void btnExit_Click(object sender, EventArgs e) 
    { 
     //Exit the application 
     this.Close(); 
    } 

    private void btnClear_Click(object sender, EventArgs e) 
    { 
     //Clear all information 
     lblDetails.Text = ""; 
     pbImage.Image = null; 
     txtTickets.Text = "0"; 
     txtCost.Text = ""; 
    } 

} 
} 
+0

你能更具體一點嗎?你想要將你的foreach代碼封裝到可重用的方法中,或者只是讓if可重用? – mikes

+0

你的意思是你只需要重構它,所以你可以調用dothis或其他? – BugFinder

+0

您可以使用委託調用方法。並在方法中循環遍歷元素並調用委託。代表可以在你的foreach塊中包含你的代碼行。 –

回答

0

您是否想要實現這樣的目標?

private void btnDetails_Click(object sender, EventArgs e) 
    { 
     //Get name of selected item from combobox 
     string eventName; 

     //Traverse array to determine the match 
     MethodAfterRefactor(() => 
     { 
      //Display details 
      lblDetails.Text = t.getDetails(); 

      //Display image 
      displayImage(t.getFileName()); 
     }); 
    } 

    private void MethodAfterRefactor(Func<object> p) 
    { 
     foreach (Ticket t in events) 
     { 
      if (t.getName().Equals(cbEvents.SelectedItem.ToString())) 
      { 
       p.Invoke(); 
      } 
     } 
    } 
+0

是的,我試圖做到這一點,除了我的問題是雖然forloop使用兩次,他們稱之爲不同的事情。當它第一次使用時,foreach循環得到「細節」和「文件名」。第二次獲得「門票成本」。被指示做一個使用foreach循環的方法,然後讓它調用兩次。這對我來說毫無意義。 –

0

試着想想這個略有不同,讓我們開始研究你真正想做什麼。

您有兩個列表,其中一個代表視圖瑕疵cbEvents,另一個是後面的數據(有時稱爲ViewModel)events

你想要做的是匹配你的ViewModel從你的視圖,因爲你只有把名字放入視圖。

如果您將ViewModel放入視圖中,以便它可以作爲名稱呈現,那麼此代碼將消失。像

public class Ticket 
{ 
    ... 

    public string override ToString() { return getName(); } 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    ... 
    //Load combobox 
    foreach (Ticket t in events) 
    { 
     cbEvents.Items.Add(t); 
    } 
} 

東西然後你可以做的東西一樣

private void btnDetails_Click(object sender, EventArgs e) 
{   
    Ticket t = cbEvents.SelectedItem as Ticket; 
    if (t !=null) 
    { 
      //Display details 
      lblDetails.Text = t.getDetails(); 

      //Display image 
      displayImage(t.getFileName());    
    } 
} 

這顯然是考慮這個的一個完全不同的方式,但要容易得多。你也可能會發現某些控件不支持綁定對象這麼好,在這種情況下(至少在的WinForms)可以使用Tag

lblText.Text = t.getName(); 
lblText.Tag = t; 

或WPF的DataContext所以你再綁定這些領域例如

<TextBlock Text="{Binding Name}"/> 
+0

感謝您的回覆。我想我可能已經想通了,因爲你們都有幫助! –