2016-01-22 96 views
0

我正在構建一個函數來減少18個按鈕的相同代碼。'object'不包含'value'

下面是代碼:

void hexagon_Click(object sender, ActionEventArgs e) 
    { 
     count++; 
     this.Dispatcher.Invoke((Action)(() => 
     { 
      sender.RectOne.Fill = sender.Brush; 
      sender.RectTwo.Fill = sender.Brush; 
      sender.RectThree.Fill = sender.Brush; 
     })); 
     if (count == 1) 
     { 
      kliknatopole = sender; 
     } 
     else if (count == 2) 
     { 
      if (kliknatopole == sender) 
      { 
       return; 
      } 
      else 
      { 
       if (kliknatopole.Brush == sender.brush) 
       { 
        levelUpControUI(level); 
        prepareForNextLevel(); 
        nextLevel1(); 
        count = 0; 
        sender.Enabled = false; 
        kliknatopole.Enabled = false; 
       } 
       else 
       { 
        this.Dispatcher.Invoke((Action)(() => 
        { 
         sender.RectOne.Fill = sender.Brush; 
         sender.RectTwo.Fill = sender.Brush; 
         sender.RectThree.Fill = sender.Brush; 
        })); 
        Thread.Sleep(500); 
        this.Dispatcher.Invoke((Action)(() => 
        { 
         sender.RectOne.Fill = Brushes.Transparent; 
         sender.RectTwo.Fill = Brushes.Transparent; 
         sender.RectThree.Fill = Brushes.Transparent; 
         kliknatopole.RectOne.Fill = Brushes.Transparent; 
         kliknatopole.RectTwo.Fill = Brushes.Transparent; 
         kliknatopole.RectThree.Fill = Brushes.Transparent; 
        })); 
        toLevelOne(); 
        count = 0; 
       } 
      } 
     } 
    } 

現在我也不知道爲什麼,但kliknatopole這是一個private objectsender不能從類HexagonControl訪問的價值觀,那就是:

public partial class HexagonControl : UserControl 
{ 
    public BaseControlLogic controlLogic { get; set; } 
    public HexagonControl() 
    { 
     InitializeComponent(); 
     controlLogic = new BaseControlLogic(); 
    } 

    public Rectangle RectOne { get { return rectOne; } } 
    public Rectangle RectTwo { get { return rectTwo; } } 
    public Rectangle RectThree { get { return rectThree; } } 
    public Brush Brush { set; get; } 
} 

對於RectOne,Two and Three,也Brush,我得到這個錯誤:

'object' does not contain a definition for 'RectOne' and no extension method 'RectOne' accepting a first argument of of type 'object' could be found

我把HexagonControl公開,但這並沒有解決它。我還試圖建立一個object和傳遞sender值,但仍然didnt修復它,它只是給了我這個Cannot implicitly convert type 'object' to 'LongName.HexagonControl'. An explicit conversion exists

什麼可能會造成這個錯誤,我怎麼能解決這個問題。

+7

你必須將'sender'轉換爲其原始類型 –

+0

@FlatEric這應該是一個答案而不是評論 – Ermiar

+0

在我的情況下,該怎麼做。我是新來的C#,對不起 –

回答

2

你要投senderHexagonControl型或發送它的價值另一個HexaControl類型變量。請嘗試以下操作:

void hexagon_Click(object sender, ActionEventArgs e) 
{ 
    if(sender.GetType() != typeof(HexagonControl)) 
      return; 
    count++; 
    HexagonControl realSender = (HexagonControl) sender; 

    [...] 

而且在方法的其餘部分使用realSender代替sender。這樣,如果sender不是HexagonControl,則可以防止Exception,只是爲了防範。

希望它有幫助!

+0

發件人部分得到修復,但現在我得到這個:操作員!不能應用於'System.Type'類型的操作數 –

+0

@Xy。嘗試更改if行:'if(sender.GetType()!= typeof(HexagonControl))',我犯了一個錯誤,已經編輯了答案,對此抱歉。 –

+0

是的,都很好。這解決了它 –

2

只投sender其原始類型:

((HexagonControl)sender).RectOne.Fill = ((HexagonControl)sender).Brush; 

當然,你必須對其他8個用法也這麼做

+0

不解決它。 –

+0

@Xy你是否已經爲*所有使用'sender'的情況做過? –

+0

是的,但我仍然得到相同的錯誤 –

相關問題