vb.net 关于同一个窗体多个数字Textbox 数字键盘输入的问题
在Form1窗体上,有文本控件:Textbox1,Textbox2,Textbox3,Textbox4 ,在窗体的右边有数字按钮,1,2,3,4,5,6,7,8,9,0,左移,右移,退格。做一个样的数字键盘,当我在任意一个文体框中输入任意数字键都可以,左移,右移,删除? vb.net textbox --------------------编程问答-------------------- 你想说什么?表示没看明白 --------------------编程问答--------------------
Public Class Form1--------------------编程问答-------------------- 针对某一textbox,移动和删除都容易,关键时你要判断是哪一个文本框,把变量传递给你的函数。我想你不想4个框都一起动作吧。 --------------------编程问答-------------------- #2写的代码是针对一个Textbox文体框的操作,我现在想对多个文体框文本框进行操作,比如就我上面说的4个吧,比如:我在Textbox1 通过当前窗体的数字按钮控件button0..button9,输入 256,我要针对它进行左移,右移,退格;完了我也可以对Textbox2 输入 1024 , 我也可以对它进行左移,右移,退格,其它的文本框同理, --------------------编程问答--------------------
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
Public Class Form1--------------------编程问答-------------------- 1.Textbox 里面找不到MouseClick 事件。
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
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)
编程 首先 是 问题分析的过程 就像拆解积木 你能拆解开 就能写出来
可以回答一个基础问题 但是不愿意回答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