2016-01-22 3 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 object и sender не может получить доступ к значениям из класса 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 в, но все еще не исправить, он просто дал мне это Cannot implicitly convert type 'object' to 'LongName.HexagonControl'. An explicit conversion exists

Что может быть причиной этой ошибки, и как я могу это исправить.

+7

Вы должны отправить 'sender' в его исходный тип –

+0

@FlatEric, это должен быть ответ, а не комментарий – Ermiar

+0

В моем случае, как это можно сделать. Я новичок в C#, извините –

ответ

2

Вы должны бросить sender к HexagonControl типа или отправить это значение другой HexaControl type переменная. Попробуйте следующее:

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

    [...] 

И использовать realSender вместо sender в остальной части метода. Таким образом, вы предотвращаете Exception в случае, если sender не является HexagonControl, только для предосторожности.

Надеюсь, это поможет!

+0

Часть отправителя исправлена, но теперь я получаю следующее: Оператор! не может применяться к opperand типа 'System.Type' –

+0

@Xy. Попробуйте изменить строку if для этого: 'if (sender.GetType()! = Typeof (HexagonControl))', я сделал ошибку, уже отредактировал ответ, извините за это. –

+0

Yup все хорошо. Это фиксировало это –

2

Просто бросить sender к своему первоначальному типу:

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

Конечно, вы должны сделать это для других 8 использований, а

+0

Не исправляет. –

+0

@ Когда вы делали это для * всех * случаев, когда вы используете 'sender'? –

+0

Да, но я все равно получаю ту же ошибку –

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