none
如何 判斷 Button 的 觸發問題.. RRS feed

  • 問題

  • 小弟我最近在寫一個飲料系統

    把txt文件裡的文字直接新增出一個button  價格跟物品是放在同一個txt裡

    txt文件是長這樣

    紅茶

    綠茶

    10

    10

     

    然後這是新增按鈕

            int count = 0 , count2=0;
            int y = 30;
            protected List<String> List文字串流 = new List<String>();
            protected List<Button> List按鈕 = new List<Button>();

    StreamReader l_reader = new StreamReader(b, Encoding.Default);
                while (true)
                {
                    List文字串流.Add(l_reader.ReadLine());
                    if (List文字串流[count] == null)
                        break;
                    count++;
                }

                    for (int i = 0; i <= (count - 1) / 2; i++)
                    {
                        Button btn飲料項目 = new Button();
                        btn飲料項目.Text = List文字串流[i];
                        btn飲料項目.Location = new Point(12, y);
                        btn飲料項目.Size = new Size(200, 30);
                        y += 30;
                        List按鈕.Add(btn飲料項目);
                    }

    按鈕是可以新增到panel1

    而小弟我的問題在於要怎麼在click時, 可以分別對應下面的值 例如紅茶  click下去 10  綠茶  click下去 20 

    實作click事件 後來想想也不對 不知道如何去分辨那個按鈕用哪一個

    想了很多就是想不到  凡請各位大大能幫忙ˊ ˋ

    2013年11月9日 上午 10:19

解答

  • 接下來是比較特別的兩種解法

    第一種

    public partial class Form1 : Form
    	{
    		public Form1()
    		{
    			InitializeComponent();
    
    			List<Drink> drinks = new List<Drink>();
    			//偷懶, 所以資料用 Hard Code
    			Drink tea01 = new Drink() { Name = "紅茶", Price = 10 };
    			Drink tea02 = new Drink() { Name = "綠茶", Price = 10 };
    			Drink tea03 = new Drink() { Name = "奶茶", Price = 15 };
    			drinks.Add(tea01);
    			drinks.Add(tea02);
    			drinks.Add(tea03);
    
    			foreach (var item in drinks)
    			{
    				Button button = new Button();
    				button.DataBindings.Add("Text", item, "Name");
    				button.Click +=button_Click;
    			    flowLayoutPanel1.Controls .Add(button);
    			}		
    		}
    
    		protected void button_Click(object sender, EventArgs e)
    		{			
    			Drink drink = (Drink)(((Control)sender).DataBindings["Text"].DataSource);
    			MessageBox.Show(drink.Price.ToString());
    		}
    	}
    
    	public class Drink
    	{
    		public string Name
    		{ get; set; }
    
    		public int Price
    		{ get; set; }
    	}

    第二種

    	public partial class Form1 : Form
    	{
    		public Form1()
    		{
    			InitializeComponent();
    			List<Drink> drinks = new List<Drink>();
    			//偷懶, 所以資料用 Hard Code
    			Drink tea01 = new Drink() { Name = "紅茶", Price = 10 };
    			Drink tea02 = new Drink() { Name = "綠茶", Price = 10 };
    			Drink tea03 = new Drink() { Name = "奶茶", Price = 15 };
    			drinks.Add(tea01);
    			drinks.Add(tea02);
    			drinks.Add(tea03);
    
    			foreach (var item in drinks)
    			{
    				Button button = new Button();
    				button.DataBindings.Add("Text", item, "Name");
    				button.Click += item.Control_click;
    				flowLayoutPanel1.Controls.Add(button);
    			}
    		}
    	}
    
    
    	public class Drink
    	{
    		
    		public string Name
    		{ get; set; }
    
    		public int Price
    		{ get; set; }
    
    		public void Control_click(object sender, EventArgs e)
    		{
    			MessageBox.Show(this.Price.ToString());
    		}
    	}


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2013年11月10日 上午 02:24
    版主

所有回覆

  • 最簡單卻不美的做法

    把 10,20 這些玩意塞給 Button.Tag 屬性

    Button.Click 事件的委派函式不是有個參數是 object sender, 你把sender 轉型回 button , 就可以取出 Tag 屬性, 然後再將他轉回 int 就行了.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年11月9日 下午 04:41
    版主
  • 接下來是比較特別的兩種解法

    第一種

    public partial class Form1 : Form
    	{
    		public Form1()
    		{
    			InitializeComponent();
    
    			List<Drink> drinks = new List<Drink>();
    			//偷懶, 所以資料用 Hard Code
    			Drink tea01 = new Drink() { Name = "紅茶", Price = 10 };
    			Drink tea02 = new Drink() { Name = "綠茶", Price = 10 };
    			Drink tea03 = new Drink() { Name = "奶茶", Price = 15 };
    			drinks.Add(tea01);
    			drinks.Add(tea02);
    			drinks.Add(tea03);
    
    			foreach (var item in drinks)
    			{
    				Button button = new Button();
    				button.DataBindings.Add("Text", item, "Name");
    				button.Click +=button_Click;
    			    flowLayoutPanel1.Controls .Add(button);
    			}		
    		}
    
    		protected void button_Click(object sender, EventArgs e)
    		{			
    			Drink drink = (Drink)(((Control)sender).DataBindings["Text"].DataSource);
    			MessageBox.Show(drink.Price.ToString());
    		}
    	}
    
    	public class Drink
    	{
    		public string Name
    		{ get; set; }
    
    		public int Price
    		{ get; set; }
    	}

    第二種

    	public partial class Form1 : Form
    	{
    		public Form1()
    		{
    			InitializeComponent();
    			List<Drink> drinks = new List<Drink>();
    			//偷懶, 所以資料用 Hard Code
    			Drink tea01 = new Drink() { Name = "紅茶", Price = 10 };
    			Drink tea02 = new Drink() { Name = "綠茶", Price = 10 };
    			Drink tea03 = new Drink() { Name = "奶茶", Price = 15 };
    			drinks.Add(tea01);
    			drinks.Add(tea02);
    			drinks.Add(tea03);
    
    			foreach (var item in drinks)
    			{
    				Button button = new Button();
    				button.DataBindings.Add("Text", item, "Name");
    				button.Click += item.Control_click;
    				flowLayoutPanel1.Controls.Add(button);
    			}
    		}
    	}
    
    
    	public class Drink
    	{
    		
    		public string Name
    		{ get; set; }
    
    		public int Price
    		{ get; set; }
    
    		public void Control_click(object sender, EventArgs e)
    		{
    			MessageBox.Show(this.Price.ToString());
    		}
    	}


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2013年11月10日 上午 02:24
    版主
  • 可是我的價格在txt文件裡?
    2013年11月10日 上午 04:49
  • 先把txt文件的內容讀進來, 建立成Bill長官製作的Disk類別的物件

    2013年11月10日 上午 05:12
  • 可是我的價格在txt文件裡?


    讀文件你不是已經會了 ? 只是建個資料模型類別, 把你讀進來的資料給它塞進去不就好了, 你可以想像如果我的展示資料中的 紅茶, 綠茶...這些如果從文件讀來差異在哪裡 ?

    就是多一個讀的動作, 和等號右方是另一個變數而已

    你可以

    Drink tea01 = new Drink()

    tea01.Name = 你讀進來的資料某一筆不就得了 ?

    程式不是顧著抄, 要花時間瞭解為什麼這麼做. 偶爾放下電腦, 拿出紙筆來模擬, 讓腦筋動一動, 會寫的更好

    補充一下: 雖然號稱支援 Unicode , 但最好還是少用中文命名變數, 雖然還沒聽過什麼災情, 但要真的出問題會搞死人, 因為這樣的問題很難找


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2013年11月10日 上午 05:46
    版主
  • 您好,
    一般來說將同一個產品建在同一列中比較好處理哦!
    如果依您目前的做法,先將Button建立起來後,馬上就可以將價格存到Button的Tag屬性之中,並設定對應的Click事件,如下,

    int count = 0, count2 = 0;
    int y = 30;
    protected List<String> List文字串流 = new List<String>();
    protected List<Button> List按鈕 = new List<Button>();
    
    private void Form1_Load(object sender, EventArgs e)
    {
    	using (FileStream b = File.Open(@"你文字檔的Path", FileMode.Open, FileAccess.Read, FileShare.Read))
    	{
    		using (StreamReader l_reader = new StreamReader(b, Encoding.GetEncoding(950), true))
    		{
    			while (true)
    			{
    				List文字串流.Add(l_reader.ReadLine());
    				if (List文字串流[count] == null)
    					break;
    				count++;
    			}
    		}
    		b.Close();
    	}
    
    	int i = 0;
    	for (i = 0; i <= (count - 1) / 2; i++)
    	{
    		Button btn飲料項目 = new Button();
    		btn飲料項目.Text = List文字串流[i];
    		btn飲料項目.Location = new Point(12, y);
    		btn飲料項目.Size = new Size(200, 30);
    		y += 30;
    		List按鈕.Add(btn飲料項目);
    	}
    	//將price存在Tag之中,並設定 click event
    	foreach (var btn in List按鈕)
    	{
    		btn.Tag = List文字串流[i];
    		i++;
    		//設定對應的button
    		btn.Click += DrinkClickProcess;
    		//加到panel之中
    		panel1.Controls.Add(btn);
    	}
    }
    
    private void DrinkClickProcess(object sender, EventArgs e)
    {
    	Button btnDrink = (sender as Button);
    	if(btnDrink !=null){
    		string drinkName = btnDrink.Text;
    		int drinkPrice = 0;
    		int.TryParse(btnDrink.Tag.ToString(), out drinkPrice);
    		Console.WriteLine("Drink Name:{0}, Price:{1}", drinkName, drinkPrice);
    		//請您再依您的需求再進行處理吧!
    	}
    	
    }
    

    • 已提議為解答 亂馬客 2013年11月11日 上午 01:23
    2013年11月10日 上午 08:17
  • 嗯 謝謝
    2013年11月10日 下午 03:04