2016-04-26 43 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

感谢您的回复。我想我可能已经想通了,因为你们都有帮助! –