2013-03-16 3 views
2

Я создаю текстовые поля на холсте во время выполнения, поэтому я не могу использовать событие KeyDown в текстовом поле, которое было нажато.Invalid Cast Exception для System.Windows.Controls.Canvas to System.Windows.Controls.TextBox

Вот мой код:

private void canvas1_KeyDown(object sender, KeyEventArgs e) 
{ 
    int line = Convert.ToInt32(((TextBox)sender).Name.Substring(4, 1)); 
    //here pop up exception 

    int column = Convert.ToInt32(((TextBox)sender).Name.Substring(3, 1)); 
} 

Исключение:

«Не удалось привести объект типа 'System.Windows.Controls.Canvas' к типу«System.Windows.Controls .Текстовое окно'."

+1

Исключение довольно ясно: 'sender' (т. Е. Объект, который запускал событие KeyDown), является' System.Windows.Controls.Canvas', но вы добавили его в 'System.Windows.Controls.TextBox'. – Leri

+0

'sender' имеет тип' System.Windows.Controls.Canvas', но вы пытаетесь использовать 'System.Windows.Controls.TextBox'. Измените приведение на '((Canvas) отправителя) ...'. – Lee

ответ

3

sender является объектом canvas, а не текстовым полем. Вы пытаетесь использовать холст как текстовое поле, которое невозможно, поэтому исключение. Почему бы не связать общий обработчик событий с текстовым полем во время выполнения?

myTextBox.KeyDown += new KeyEventHandler(TextBox_KeyDown); 

private void TextBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    //the sender will be a TextBox here, but perform a check to avoid null exception 
    TextBox tb = sender as TextBox; 
    if(tb != null) 
    { 
     //your textbox code 
    } 
} 
+0

+1 избили меня. :) –

+0

На этот раз ...: D – keyboardP

0

Вы не можете преобразовать объект Canvas в текстовое поле.

Когда текстовые поля создаются динамически, вы можете установить функцию для события keydown.

mytextbox.KeyDown += myFunction; 
0

Вы выполняете литую (TextBox) отправителя, однако отправитель не типа TextBox, то «отправитель» события ваш холст.

Попробуйте направить отправителя на холст, а затем используйте FindControl(), чтобы найти текстовое поле.

В качестве альтернативы вы можете назначить обработчик событий KeyDown для своего TextBox после его создания.

1

Вы пытаетесь создать холст в виде текстового поля и, следовательно, исключение. Как видно из вашего кода, событие keydown связано с холстом, а не с текстовым полем, и объект-отправитель всегда будет холстом в этом случае.

При создании текстового поля во время выполнения вам необходимо прикрепить событие keydown к текстовому полю во время выполнения.

TextBox newTextBox = new TextBox(); 

newTextBox.KeyDown += new KeyEventHandler(newTextBox_KeyDown); 

... 

private void newTextBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    // Code to do 
} 

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

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