当前位置:编程学习 > C#/ASP.NET >>

vb.net 关于同一个窗体多个数字Textbox 数字键盘输入的问题

在Form1窗体上,有文本控件:Textbox1,Textbox2,Textbox3,Textbox4 ,在窗体的右边有数字按钮,1,2,3,4,5,6,7,8,9,0,左移,右移,退格。做一个样的数字键盘,当我在任意一个文体框中输入任意数字键都可以,左移,右移,删除? vb.net textbox --------------------编程问答-------------------- 你想说什么?
表示没看明白 --------------------编程问答--------------------
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.TextBox1.Text = Me.TextBox1.Text & "1"
        Me.TextBox1.SelectionStart = Me.TextBox1.Text.Length + 1
        Me.TextBox1.Focus()

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If Me.TextBox1.Text.Length > 0 Then
            Me.TextBox1.Text = Me.TextBox1.Text.Substring(0, Me.TextBox1.Text.Length - 1)
        End If

        Me.TextBox1.SelectionStart = Me.TextBox1.Text.Length + 1
        Me.TextBox1.Focus()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Me.TextBox1.SelectionStart = Me.TextBox1.SelectionStart + 1
        Me.TextBox1.Focus()
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        If Me.TextBox1.SelectionStart <> 0 Then
            Me.TextBox1.SelectionStart = Me.TextBox1.SelectionStart - 1
            Me.TextBox1.Focus()
        Else
            Me.TextBox1.SelectionStart = 0
            Me.TextBox1.Focus()
        End If
    End Sub
End Class
--------------------编程问答-------------------- 针对某一textbox,移动和删除都容易,关键时你要判断是哪一个文本框,把变量传递给你的函数。我想你不想4个框都一起动作吧。 --------------------编程问答-------------------- #2写的代码是针对一个Textbox文体框的操作,我现在想对多个文体框文本框进行操作,比如就我上面说的4个吧,比如:我在Textbox1 通过当前窗体的数字按钮控件button0..button9,输入 256,我要针对它进行左移,右移,退格;完了我也可以对Textbox2 输入 1024 , 我也可以对它进行左移,右移,退格,其它的文本框同理, --------------------编程问答--------------------
Public Class Form1

    Private FocusedTextbox As TextBox
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.FocusedTextbox.Text = Me.FocusedTextbox.Text & "1"
        Me.FocusedTextbox.SelectionStart = Me.FocusedTextbox.Text.Length + 1
        Me.FocusedTextbox.Focus()

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If Me.FocusedTextbox.Text.Length > 0 Then
            Me.FocusedTextbox.Text = Me.FocusedTextbox.Text.Substring(0, Me.FocusedTextbox.Text.Length - 1)
        End If

        Me.FocusedTextbox.SelectionStart = Me.FocusedTextbox.Text.Length + 1
        Me.FocusedTextbox.Focus()
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Me.FocusedTextbox.SelectionStart = Me.FocusedTextbox.SelectionStart + 1
        Me.FocusedTextbox.Focus()
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        If Me.FocusedTextbox.SelectionStart <> 0 Then
            Me.FocusedTextbox.SelectionStart = Me.FocusedTextbox.SelectionStart - 1
            Me.FocusedTextbox.Focus()
        Else
            Me.FocusedTextbox.SelectionStart = 0
            Me.FocusedTextbox.Focus()
        End If
    End Sub

    Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
        FocusedTextbox = Me.TextBox1
    End Sub

    Private Sub TextBox2_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDown
        FocusedTextbox = Me.TextBox2
    End Sub


    Private Sub TextBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseClick
        FocusedTextbox = Me.TextBox1
    End Sub

    Private Sub TextBox2_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox2.MouseClick
        FocusedTextbox = Me.TextBox2
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        FocusedTextbox = Me.TextBox1
    End Sub
End Class
--------------------编程问答-------------------- 1.Textbox 里面找不到MouseClick 事件。
2.退格功能:If Me.FocusedTextbox.Text.Length > 0 Then
            Me.FocusedTextbox.Text = Me.FocusedTextbox.Text.Substring(0, Me.FocusedTextbox.Text.Length - 1)
        End If
        Me.FocusedTextbox.SelectionStart = Me.FocusedTextbox.SelectionStart + 1
        Me.FocusedTextbox.Focus()
这段程序能实现能从末尾删除,我现在想从当前焦点位置开始删除,怎么写?
如:1024   当焦点到0和之间,把0删除。  --------------------编程问答-------------------- 自己也动动脑筋吧,提示到这个份上了,还用的着说么

        Dim str As String = "1234"
        str = str.Remove(1, 1)
        MsgBox(str)
--------------------编程问答-------------------- 初学,还是感谢! --------------------编程问答--------------------
引用 8 楼 glove_0924 的回复:
初学,还是感谢!
楼主我也是新手,和你遇到了一样的问题网上加看书都快一星期了没一点头绪,如果你的问题已近解决了不知是否方便把源码借小弟一看,理下头绪 --------------------编程问答-------------------- 其实我想说

编程  首先 是  问题分析的过程   就像拆解积木  你能拆解开  就能写出来

可以回答一个基础问题  但是不愿意回答1个合成问题

每次打开  一个问题帖子,首先 发现的是  这个问题  没有被拆解   
回答一个问题  相当于回答10个     然后就没心情了 --------------------编程问答-------------------- 你这个问题  我会这样拆解

1 如何 让 多个 控件  使用一个过程 解决问题,这样就不用挨个打字了
2 如何在一个过程中  识别 是由那个控件触发的
3 如何分解字符串  1234  变成  1 2 3 4  
4 继续的话  我会尝试  string()   arraylist   list(of string)   list(of int)     哪个好用
5 光标的位置 怎么提取【其实就是个属性,你把文本框的属性 看全 自然知道】
6 最后是合并字符串 简单的用 &   专业的用 stingbuild --------------------编程问答-------------------- using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//加入System.Reflection
using System.Reflection;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //设置按钮标签
            button1.Text = "A";
            button2.Text = "B";
            //邦定按钮的Click事件到统一的处理过程
            button1.Click += new EventHandler(button_Click);
            button2.Click += new EventHandler(button_Click);
            //设置按钮无焦点
            SetButton(button1);
            SetButton(button2);
        }
        /// <summary>
        /// 该函数让传入的按钮不吸收焦点
        /// </summary>
        /// <param name="button">需要设置为不吸收焦点的按钮</param>
        private void SetButton(Button button)
        {
            MethodInfo methodinfo = button.GetType().GetMethod("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod);
            methodinfo.Invoke(button, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, new Object[] { ControlStyles.Selectable, false }, Application.CurrentCulture);
        }
        /// <summary>
        /// 某软件盘按钮的Click处理过程
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button_Click(object sender, EventArgs e)
        {
            //循环遍历所有控件
            foreach (Control ctl in this.Controls)
            {
                if (ctl.Focused)//如果控件有焦点
                {
                    if (ctl is TextBox)//如果控件是文本框
                    {
                        TextBox textBox = (TextBox)ctl;//得到这个文本框
                        int st = textBox.SelectionStart;//光标选择的起始位置
                        int sl = textBox.SelectionLength;//光标选择的终止位置
                        String str = ((Button)sender).Text;//按钮的标签文本
                        textBox.Text = textBox.Text.Substring(0, st) + str + textBox.Text.Substring(st + sl);//文本框光标选择前的文本+按钮文本+光标选择后的文本
                        textBox.SelectionStart = st+str.Length;//移动光标
                    }
                }
            }
        }
    }
}
--------------------编程问答-------------------- 上面的代码需要预先绘制两个按钮,若干文本框。
上面代码几个关键技术点:
1.软件盘的按钮是不吸收焦点的,例如计算器的按钮.实现方式见函数SetButton
2.将软件盘按钮的Click事件邦定到同一个处理程序button_Click
3.找到当前具有焦点的文本框button_Click的foreach部分
4.软件盘不是简单地将字符插入到最后,而是替换当前选择的文本,见textBox.Text.Substring(0, st) + str + textBox.Text.Substring(st + sl);
5.先记录好SelectionStart、SelectionLength的属性值,再对textBox.Text进行改变。
上面的代码没有讨论退格和方向键,请你完善。

祝你做出完美的软件盘。
--------------------编程问答-------------------- 呵呵,忘记了是VB。下面是VB.net代码,已经测试过。
'加入System.Reflection
Imports System.Reflection
Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        '设置按钮标签
        Button1.Text = "A"
        Button2.Text = "B"
        '设置按钮无焦点
        SetButton(Button1)
        SetButton(Button2)
    End Sub
    ''' <summary>
    ''' 该函数让传入的按钮不吸收焦点
    ''' </summary>
    ''' <param name="button">需要设置为不吸收焦点的按钮</param>
    Private Sub SetButton(ByVal button As Button)
        Dim methodinfo As MethodInfo = button.[GetType]().GetMethod("SetStyle", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod)
        methodinfo.Invoke(button, BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, New [Object]() {ControlStyles.Selectable, False}, Application.CurrentCulture)
    End Sub
    ''' <summary>
    ''' 某软件盘按钮的Click处理过程
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub button_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click, Button2.Click
        '循环遍历所有控件
        For Each ctl As Control In Me.Controls
            If ctl.Focused Then
                '如果控件有焦点
                If TypeOf ctl Is TextBox Then
                    '如果控件是文本框
                    Dim textBox As TextBox = DirectCast(ctl, TextBox)
                    '得到这个文本框
                    Dim st As Integer = textBox.SelectionStart
                    '光标选择的起始位置
                    Dim sl As Integer = textBox.SelectionLength
                    '光标选择的终止位置
                    Dim str As [String] = DirectCast(sender, Button).Text
                    '按钮的标签文本
                    textBox.Text = textBox.Text.Substring(0, st) & str & textBox.Text.Substring(st + sl)
                    '文本框光标选择前的文本+按钮文本+光标选择后的文本
                    '移动光标
                    textBox.SelectionStart = st + str.Length
                End If
            End If
        Next
    End Sub
End Class
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,