System.Windows.Controls.Canvas到System.Windows.Controls.TextBox的无效Cast异常

时间:2013-03-16 13:33:29

标签: c# .net wpf

我在运行时在画布上创建文本框,这就是为什么我不能在按下的文本框上使用事件KeyDown

这是我的代码:

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.TextBox'。”

4 个答案:

答案 0 :(得分:3)

sender是画布对象而不是文本框。您试图将画布作为不可能的文本框进行投射,因此例外。为什么不在运行时将公共事件处理程序附加到文本框?

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
    }
}

答案 1 :(得分:1)

您正在尝试将画布转换为文本框,因此例外。从代码中可以看出,keydown事件与画布相关联,而不是文本框,在这种情况下发送方对象将始终是画布。

如果在运行时创建了文本框,则需要在运行时将keydown事件附加到文本框中。

TextBox newTextBox = new TextBox();

newTextBox.KeyDown += new KeyEventHandler(newTextBox_KeyDown);

...

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

希望这有帮助。

答案 2 :(得分:0)

您无法将Canvas对象转换为文本框。

当动态创建文本框时,您可以为keydown事件设置一个函数。

mytextbox.KeyDown += myFunction;

答案 3 :(得分:0)

您正在执行演员表(TextBox)发件人,但发件人不是TextBox类型,事件的“发件人”是您的画布。

尝试将发件人转换为Canvas,然后使用FindControl()查找文本框。

或者,您可以在创建TextBox后为其分配KeyDown事件处理程序。