在聚焦的文本框和 DataGridView 单元格上使用虚拟键盘

2023-12-08

在我的表单中,我有各种文本框,我使用按钮创建的表单键盘写入这些文本框。我在 Form.Load 中有这段代码,它使用事件处理程序来确定哪个文本框具有焦点:

For Each control As Control In Me.Controls
    If control.GetType.Equals(GetType(TextBox)) Then
        Dim textBox As TextBox = control
        AddHandler textBox.Enter, Sub() FocussedTextbox = textBox
     End If
Next

然后我在每个按钮上使用它来写一个特定的字符:

Private Sub btnQ_Click(sender As Object, e As EventArgs) Handles btnQ.Click
    If btnQ.Text = "Q" Then
        FocussedTextbox.Text += "Q"
    ElseIf btnQ.Text = "q" Then
        FocussedTextbox.Text += "q"
    End If
End Sub

到目前为止,我一切都很好,一切都按预期进行。问题是我也有一个DataGridView我想写入,但无法像在文本框上那样专注于选定的单元格。

我试过这个:

For Each control As Control In Me.Controls
    If control.GetType.Equals(GetType(TextBox)) Then
        Dim textBox As TextBox = control
        AddHandler textBox.Enter, Sub() FocussedTextbox = textBox
    ElseIf control.GetType.Equals(GetType(DataGridViewCell)) Then
        Dim DGVC As DataGridView = control
        AddHandler DGVC.CellBeginEdit, Sub() FocussedTextbox = DGVC
    End If
Next

但它只是选择我的最后一个文本框。

我声明了变量FocussedTextbox as Control所以它不是特定于文本框而是任何控件。

任何帮助将不胜感激。


向当前添加文本主动控制使用按钮时,这些按钮不得窃取 ActiveControl 的焦点(否则它们将成为 ActiveControl)。
这样,您还可以避免所有这些FocusedTextbox = textBox等等并删除该代码。

您只需要没有设置 Selectable 属性的按钮。您可以使用从 Button 派生的自定义控件并删除ControlStyles.Selectable在其构造函数中使用SetStyle method:

Public Class ButtonNoSel
    Inherits Button
    Public Sub New()
        SetStyle(ControlStyles.Selectable, False)
    End Sub
End Class

将您的按钮替换为这个按钮(或者,如果您已经在使用自定义控件,则只需设置样式)。


要用此自定义控件替换现有按钮:

  • 将新的类对象添加到您的项目中,为其命名ButtonNoSel,将上面的所有代码复制到新类中以替换您在其中找到的两行代码。
  • 构建项目。您可以找到ButtonNoSel现在就在您的工具箱中进行控制。用这个按钮替换您的按钮。
  • Or, open up the Form's Designer file and replace (CTRL+H) all System.Windows.Forms.Button() related to the Virtual KeyBoard with ButtonNoSel.
  • 删除现有的事件处理程序,不再需要它们。

在托管这些按钮(表单或您正在使用的任何其他内容)的类的构造函数中添加相同的 Click 事件处理程序。
然后,您可以删除您现在拥有的所有这些事件处理程序,每个控件一个。所有事件只需要一个事件处理程序:

Public Sub New()
    InitializeComponent()

    For Each ctrl As Control In Me.Controls.OfType(Of ButtonNoSel)
        AddHandler ctrl.Click, AddressOf KeyBoardButtons_Click
    Next
End Sub

当然,您也不需要向任何其他控件添加事件处理程序,这就是所需的全部。

现在,您可以过滤您希望键盘使用的控件类型,例如,TextBoxBase控件(TextBox 和 RichTextBox)、DataGridView、NumericUpDown 等。
或者只过滤需要的特殊情况特别待遇(例如,月份日历)。

要添加与按下的按钮相对应的字符,您可以使用SendKeys.Send():它将在当前插入点插入新字符,因此您不需要任何其他代码来存储和重置插入符号/光标位置,就像设置控件的 Text 属性一样。

在此示例中,我正在检查是否ActiveControl is a TextBoxBase控制,然后只需发送单击的按钮保存的字符。
如果是DataGridView,先发送F2进入编辑模式,然后发送字符。
您也可以只发送一个字符(因此不需要过滤器),但在这种情况下,您将替换而不是添加该单元格的现有值。

Private Sub KeyBoardButtons_Click(sender As Object, e As EventArgs)
    Dim selectedButton = DirectCast(sender, Control)
    Dim keysToSend = String.Empty

    If TypeOf ActiveControl Is TextBoxBase Then
        keysToSend = selectedButton.Text
    ElseIf TypeOf ActiveControl Is DataGridView Then
        Dim ctrl = DirectCast(ActiveControl, DataGridView)
        If TypeOf ctrl.CurrentCell IsNot DataGridViewTextBoxCell Then Return
        SendKeys.Send("{F2}")
        keysToSend = selectedButton.Text
    Else
        ' Whatever else
    End If
    If Not String.IsNullOrEmpty(keysToSend) Then
        SendKeys.Send(keysToSend)
    End If
End Sub

► 请注意{F2}仅发送一次:当单元格进入编辑模式时,ActiveControl is a DataGridViewTextBoxEditingControl,因此是一个 TextBox 控件,由TextBoxBase filter.

这就是它的工作原理(仅使用此处发布的代码):

Virtual Keyboard SendKeys

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在聚焦的文本框和 DataGridView 单元格上使用虚拟键盘 的相关文章

  • c Sharp exe 在打开时应要求“以管理员身份运行”提示

    我有一个由 c Sharp 程序生成的 exe 当我运行 exe 时 我希望出现 UAC 提示 并提供以管理员身份运行 exe 的选项 我见过默认以管理员身份运行 exe 的示例 但是 如何让 UAC 要求我以管理员身份运行 exe 任何想
  • SSDT 单元测试:从配置文件读取 SQL Server 单元测试设置时发生错误

    我在 Visual Studio 2013 professional 中创建了一个数据库项目 然后通过右键单击存储过程之一并选择来添加单元测试创建单元测试 选择创建一个新的VB测试项目 然后右键单击新创建的测试项目并选择SQL Server
  • RichTextBox 选择同一单词的多次出现

    我使用 C Windows 窗体 创建了类似记事本的应用程序 并且我想添加 查找 功能 该功能将突出显示搜索词的每个外观 但是我不知道如何添加到现有选择中 因此我最终只突出显示搜索词的最后一次出现 这是我的代码 Regex regex ne
  • 如何增加工具条上按钮的大小?

    我已在表单中添加了一个工具条 在此工具条中 我在 添加工具条 按钮的帮助下有一些按钮 这些按钮的默认尺寸为 22 20 但我想将按钮的尺寸更改为 25 50 我通过更改尺寸属性在设计器中进行了更改 但它没有反映在我的表单中 即使我改变工具条
  • 创建一个从系统托盘运行的程序

    我想创建一个从 Windows 右下角系统托盘运行的程序 但我不知道从哪里开始 有人可以告诉 告诉我在哪里查找和示例或使用什么命令 研究吗 Add a NotifyIcon到主窗口窗体 使用Resize事件在Form控制何时显示Notify
  • 在运行时从调试可视化工具中检测源语言

    我正在写一个Visual Studio 的调试可视化工具 https github com zspitz ExpressionToString visual studio debugger visualizer for expression
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 设置 NLS_LANG 以进行 Oracle 管理的数据访问

    我有一个 winforms c 应用程序 通过 oracle manageddataaccess 通过 NHibernate 4 0 使用 Oracle 12c oracle 数据库位于客户站点的另一台计算机上 由于 oracle 数据库和
  • 字段永远不会被分配,并且始终具有默认值 0

    我的代码中出现以下错误 我不知道为什么 警告 SummaryForm m difficulty is never assigned to and will always have its default value 0 Code publi
  • WinForm 中的 OpenID?

    有谁知道在 WinForm net 2 0 和 C 中使用或不使用 RPX 的 OpenID 的最佳 或任何 教程 由于 WinForms 是一个客户端接口 并且 OpenID 要求您实际运行 Web 服务器 因此您可能只想在某个地方设置一
  • VB。 NET:请求已中止:无法创建 SSL/TLS 安全通道

    我有一个用 VB net 编码的应用程序 它有这种访问 Web 服务的方法 我遇到了这个错误 在搜索修复后我仍然没有运气 错误 请求被中止 无法创建 SSL TLS 安全通道 ServicePointManager Expect100Con
  • End using 是否关闭打开的 SQL 连接

    如果我将 SQLConnection 包装在 using 中 我应该关闭它还是最终 using 处理它 using cn as new system data sqlclient sqlconnection cn open do a bun
  • 有没有更快的方法来获取卷序列号?

    您好 我正在使用此代码来生成机器签名 但执行起来需要相当长的时间 想知道为什么这么慢 有什么更快的方法推荐吗 Public Shared Function DriveSN ByVal DriveLetter As String As Str
  • 如何从另一个线程阻止 UI 线程或强制表单在 UI 线程内运行

    我的应用程序的一个要求是 如果它失去数据库连接 那么它必须弹出一个大模式 无连接 稍后重试 对话框 阻止所有用户交互 直到重新获得连接为止 我通过在应用程序启动时启动 DeviceMonitor 类的实例来实现此目的 该类创建一个 Syst
  • 无需 Excel 和 OLEDB 即可读取 .xlsx

    是否有机会在 C 中读取 xlsx 文件 而无需在客户端上安装 Excel 并且没有可用的 OLEDB 连接 该应用程序是一个用 VS2005 C NET Framework 2 0 编写的 Winforms 项目 这里的这个怎么样 EPP
  • 在 C# 中将日期值从一个 Windows 传递到另一个窗体

    我正在开发一个非常复杂的项目 而且我对 windows 项目非常陌生 我有 2 份表格 ViewSchedule cs Scheduler cs 这是一个对话框形式 ViewSchedule cs有两个日期可供从日历中选择 选择了两个日期
  • 友好的 URL 和查询字符串

    在我的项目 ASP NET Web Forms 中我想使用友好的网址 http www nuget org packages Microsoft AspNet FriendlyUrls 从 NuGet 安装 我注册了route in 全局
  • Winforms 高 DPI 不缩放字体大小

    在我的 NET 4 7 Windows 窗体应用程序中 我按照说明配置了高 DPI 支持here https learn microsoft com en us dotnet desktop winforms high dpi suppor
  • 从 C# 运行多个 python 脚本

    我希望有人能够在这里帮助我 我对 C 比较陌生 正在尝试执行我在 C winform 应用程序中编写的一些 Python 代码 我想做的是从 winform 中的文本框中输入名称 并让它通过 python 脚本进行处理 并在 winform

随机推荐