2

我在运行时在画布上创建文本框,这就是为什么我不能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

4 回答 4

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
    }
}
于 2013-03-16T13:42:16.970 回答
1

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

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

TextBox newTextBox = new TextBox();

newTextBox.KeyDown += new KeyEventHandler(newTextBox_KeyDown);

...

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

希望这可以帮助。

于 2013-03-16T13:51:04.760 回答
0

您不能将 Canvas 对象转换为文本框。

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

mytextbox.KeyDown += myFunction;
于 2013-03-16T13:42:52.407 回答
0

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

尝试将您的发件人投射到 Canvas,然后使用 FindControl() 查找您的文本框。

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

于 2013-03-16T13:45:12.787 回答