选择“2345”这几个字符,光标可能在‘2’的前面,也可能在‘5’的后面,这个时候的selectionStart都等于1,所以无法判别光标究竟在哪里。
29 个解决方案
#1
参考c-sharpcorner这篇文章:
xConsole: Extending System.Console Class Functionality
http://www.c-sharpcorner.com/Code/2002/May/ExtendSysConsole.asp
xConsole: Extending System.Console Class Functionality
http://www.c-sharpcorner.com/Code/2002/May/ExtendSysConsole.asp
#2
.....
比如textBox.Text=“1234567”
选择“2345”这几个字符,光标可能在‘2’的前面,也可能在‘5’的后面,这个时候的selectionStart都等于1,所以无法判别光标究竟在哪里。
你到底要光标 还是字符下表?
比如textBox.Text=“1234567”
选择“2345”这几个字符,光标可能在‘2’的前面,也可能在‘5’的后面,这个时候的selectionStart都等于1,所以无法判别光标究竟在哪里。
你到底要光标 还是字符下表?
#3
textBox.selectionStart=字符的位置
#4
变通的方法
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace WindowsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.textBox1.Text = "jinjazz";
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 1;
this.Text = this.textBox1.SelectionStart.ToString();
this.textBox1.SelectionLength = i;
}
}
}
#5
顶一下,有空能不能讲一下,你做的这个小功能,感觉很有兴趣。
#6
如果TEXTBOX里边有字符选一组
text.selectionStart一定起点的位置
text.selectionStart一定起点的位置
#7
mark一下看看
#8
selectionStart
#9
int start;
this.textBox1.Focus();
if (this.textBox1.SelectionLength > 0)
{
SendKeys.Send("{LEFT}");
Application.DoEvents();
start = this.textBox1.SelectionStart + 1;
}
else
start = this.textBox1.SelectionStart ;
this.textBox1.SelectionStart = start;
this.label1.Text = start.ToString();
#10
是要光标的位置,不是选择字符的起始位置。
这两个概念是不同的。
winform里的textbox里的字符串,从左往右选,和从右往左选取同样的字符,selectionStart是相同的,但是光标位置不同,一个在最后面,另一个在最前面。
#11
不管从右往左还是从左往右,光标位置就是选择之后的位置,也就是选择之后光标位置是改变的
我上边的答案完全正确,你试试就知道了
我上边的答案完全正确,你试试就知道了
#12
路过,楼主揭贴,收藏ing!!!!!!!!!
#13
这个功能有点意思
值得学习一下.
值得学习一下.
#14
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 0; //**************
this.Text = this.textBox1.SelectionStart.ToString();
//this.textBox1.SelectionLength = i; //**************
}
你这么改一下,然后从左边往右选,这时光标在最后面,然后执行这个方法,前后的光标位置是不同的
#15
不好意思,前面理解错误,这么改
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 1;
this.Text = (this.textBox1.SelectionStart+i).ToString();
this.textBox1.SelectionLength = i;
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 1;
this.Text = (this.textBox1.SelectionStart+i).ToString();
this.textBox1.SelectionLength = i;
}
#16
如果光标在textbox最左边,和光标在第一个字符后,得到的结果相同
#17
这个还是同样的问题,从右往左选的时候,光标在最左边,可是这个方法之后,光标跑到右边去了
#18
我就是想获得光标的位置,但是如果选了文本框中的字符,那光标的位置就不好得到了
#19
完美解决
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;
namespace WindowsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("user32.dll")]
private static extern bool GetCaretPos(out Point ppt);
private void Form1_Load(object sender, EventArgs e)
{
this.textBox1.Text = "jinjazz";
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
Point p;
GetCaretPos(out p);
int i=this.textBox1.GetCharIndexFromPosition(p);
this.Text = i.ToString();
}
}
}
#20
学习一下
#21
收藏了,LZ
如果实现了 麻烦把正解再详细的贴上来可以吗?
如果实现了 麻烦把正解再详细的贴上来可以吗?
#22
再帮你顶顶。
#23
ok,就是它了
#24
int start;
this.textBox1.Focus();
if (this.textBox1.SelectionLength > 0)
{
start = this.textBox1.SelectionStart;
int lenght=this.textBox1.SelectionLength;
SendKeys.Send("+{RIGHT}");
Application.DoEvents();
if (this.textBox1.SelectionLength >= lenght)
start = start + lenght;
}
else
start = this.textBox1.SelectionStart ;
this.textBox1.SelectionStart = start;
this.label1.Text = start.ToString();
#25
19楼的代码:
1、当输入焦点没有在编辑框中(比如有多个输入框),这样光标的位置获取并非指定。
当然可以考虑获取之前先Focus()一下。
2、GetCharIndexFromPosition()方法有缺陷,当光标在最后一个字符来回的时候数值不变-_-!!!得完善一下。
1、当输入焦点没有在编辑框中(比如有多个输入框),这样光标的位置获取并非指定。
当然可以考虑获取之前先Focus()一下。
2、GetCharIndexFromPosition()方法有缺陷,当光标在最后一个字符来回的时候数值不变-_-!!!得完善一下。
public virtual int GetCharIndexFromPosition(Point pt)
{
int lParam = NativeMethods.Util.MAKELONG(pt.X, pt.Y);
int n = (int) UnsafeNativeMethods.SendMessage(new HandleRef(this, base.Handle), 0xd7, 0, lParam); //EM_CHARFROMPOS = 0xd7
n = NativeMethods.Util.LOWORD(n);
if (n < 0)
{
return 0;
}
string text = this.Text;
if (n >= text.Length)
{
n = Math.Max(text.Length - 1, 0); //<<<<<<<
}
return n;
}
#26
>>GetCharIndexFromPosition()方法有缺陷,当光标在最后一个字符来回的时候数值不变-_-!!!得完善一下。
汗...
这个是ms的问题?
汗...
这个是ms的问题?
#27
嗯
,
内
核
代
码
是
这
样
的
。
。
。
。
#28
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 1;
this.Text = this.textBox1.SelectionStart.ToString();
this.textBox1.SelectionLength = i;
this.textBox1.SelectionLength = 1;
this.Text = this.textBox1.SelectionStart.ToString();
this.textBox1.SelectionLength = i;
#29
留印
#1
参考c-sharpcorner这篇文章:
xConsole: Extending System.Console Class Functionality
http://www.c-sharpcorner.com/Code/2002/May/ExtendSysConsole.asp
xConsole: Extending System.Console Class Functionality
http://www.c-sharpcorner.com/Code/2002/May/ExtendSysConsole.asp
#2
.....
比如textBox.Text=“1234567”
选择“2345”这几个字符,光标可能在‘2’的前面,也可能在‘5’的后面,这个时候的selectionStart都等于1,所以无法判别光标究竟在哪里。
你到底要光标 还是字符下表?
比如textBox.Text=“1234567”
选择“2345”这几个字符,光标可能在‘2’的前面,也可能在‘5’的后面,这个时候的selectionStart都等于1,所以无法判别光标究竟在哪里。
你到底要光标 还是字符下表?
#3
textBox.selectionStart=字符的位置
#4
变通的方法
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace WindowsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.textBox1.Text = "jinjazz";
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 1;
this.Text = this.textBox1.SelectionStart.ToString();
this.textBox1.SelectionLength = i;
}
}
}
#5
顶一下,有空能不能讲一下,你做的这个小功能,感觉很有兴趣。
#6
如果TEXTBOX里边有字符选一组
text.selectionStart一定起点的位置
text.selectionStart一定起点的位置
#7
mark一下看看
#8
selectionStart
#9
int start;
this.textBox1.Focus();
if (this.textBox1.SelectionLength > 0)
{
SendKeys.Send("{LEFT}");
Application.DoEvents();
start = this.textBox1.SelectionStart + 1;
}
else
start = this.textBox1.SelectionStart ;
this.textBox1.SelectionStart = start;
this.label1.Text = start.ToString();
#10
是要光标的位置,不是选择字符的起始位置。
这两个概念是不同的。
winform里的textbox里的字符串,从左往右选,和从右往左选取同样的字符,selectionStart是相同的,但是光标位置不同,一个在最后面,另一个在最前面。
#11
不管从右往左还是从左往右,光标位置就是选择之后的位置,也就是选择之后光标位置是改变的
我上边的答案完全正确,你试试就知道了
我上边的答案完全正确,你试试就知道了
#12
路过,楼主揭贴,收藏ing!!!!!!!!!
#13
这个功能有点意思
值得学习一下.
值得学习一下.
#14
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 0; //**************
this.Text = this.textBox1.SelectionStart.ToString();
//this.textBox1.SelectionLength = i; //**************
}
你这么改一下,然后从左边往右选,这时光标在最后面,然后执行这个方法,前后的光标位置是不同的
#15
不好意思,前面理解错误,这么改
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 1;
this.Text = (this.textBox1.SelectionStart+i).ToString();
this.textBox1.SelectionLength = i;
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 1;
this.Text = (this.textBox1.SelectionStart+i).ToString();
this.textBox1.SelectionLength = i;
}
#16
如果光标在textbox最左边,和光标在第一个字符后,得到的结果相同
#17
这个还是同样的问题,从右往左选的时候,光标在最左边,可是这个方法之后,光标跑到右边去了
#18
我就是想获得光标的位置,但是如果选了文本框中的字符,那光标的位置就不好得到了
#19
完美解决
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;
namespace WindowsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("user32.dll")]
private static extern bool GetCaretPos(out Point ppt);
private void Form1_Load(object sender, EventArgs e)
{
this.textBox1.Text = "jinjazz";
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
Point p;
GetCaretPos(out p);
int i=this.textBox1.GetCharIndexFromPosition(p);
this.Text = i.ToString();
}
}
}
#20
学习一下
#21
收藏了,LZ
如果实现了 麻烦把正解再详细的贴上来可以吗?
如果实现了 麻烦把正解再详细的贴上来可以吗?
#22
再帮你顶顶。
#23
ok,就是它了
#24
int start;
this.textBox1.Focus();
if (this.textBox1.SelectionLength > 0)
{
start = this.textBox1.SelectionStart;
int lenght=this.textBox1.SelectionLength;
SendKeys.Send("+{RIGHT}");
Application.DoEvents();
if (this.textBox1.SelectionLength >= lenght)
start = start + lenght;
}
else
start = this.textBox1.SelectionStart ;
this.textBox1.SelectionStart = start;
this.label1.Text = start.ToString();
#25
19楼的代码:
1、当输入焦点没有在编辑框中(比如有多个输入框),这样光标的位置获取并非指定。
当然可以考虑获取之前先Focus()一下。
2、GetCharIndexFromPosition()方法有缺陷,当光标在最后一个字符来回的时候数值不变-_-!!!得完善一下。
1、当输入焦点没有在编辑框中(比如有多个输入框),这样光标的位置获取并非指定。
当然可以考虑获取之前先Focus()一下。
2、GetCharIndexFromPosition()方法有缺陷,当光标在最后一个字符来回的时候数值不变-_-!!!得完善一下。
public virtual int GetCharIndexFromPosition(Point pt)
{
int lParam = NativeMethods.Util.MAKELONG(pt.X, pt.Y);
int n = (int) UnsafeNativeMethods.SendMessage(new HandleRef(this, base.Handle), 0xd7, 0, lParam); //EM_CHARFROMPOS = 0xd7
n = NativeMethods.Util.LOWORD(n);
if (n < 0)
{
return 0;
}
string text = this.Text;
if (n >= text.Length)
{
n = Math.Max(text.Length - 1, 0); //<<<<<<<
}
return n;
}
#26
>>GetCharIndexFromPosition()方法有缺陷,当光标在最后一个字符来回的时候数值不变-_-!!!得完善一下。
汗...
这个是ms的问题?
汗...
这个是ms的问题?
#27
嗯
,
内
核
代
码
是
这
样
的
。
。
。
。
#28
int i = this.textBox1.SelectionLength;
this.textBox1.SelectionLength = 1;
this.Text = this.textBox1.SelectionStart.ToString();
this.textBox1.SelectionLength = i;
this.textBox1.SelectionLength = 1;
this.Text = this.textBox1.SelectionStart.ToString();
this.textBox1.SelectionLength = i;
#29
留印