textbox问题

yhxxy 2009-04-20 04:22:54
想在C#的winform窗体中实现,textbox中,按回车后,根据文本框内容发生变化,如"原有内容"+换行+"aaaa>",然后光标要停留在"aaaa>"的后面,而不是转到下一行,请教高手.
...全文
244 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhxxy 2009-04-24
  • 打赏
  • 举报
回复
我后来发现就是因为没绑定,呵呵.
结帖,给分.
谢谢wartim
wartim 2009-04-23
  • 打赏
  • 举报
回复
'\n' 是一个转义字符怎么会是连个字符,你新建一个项目,把我的代码拷贝进去再运行看下参考吧,我测试过了,
yhxxy 2009-04-23
  • 打赏
  • 举报
回复
是不是richTextBox1.Text[richTextBox1.TextLength - 1] == '\n'这个条件有问题啊?看上去应该是左侧是数组中的某个字符,而右侧是两个字符啊
yhxxy 2009-04-23
  • 打赏
  • 举报
回复
为什么在我这里
if (richTextBox1.TextLength > 0 && richTextBox1.Text[richTextBox1.TextLength - 1] == '\n')
{
if (richTextBox1.Text.ToUpper().LastIndexOf(@"CD C:\") > 0) // 随便举个例子
Prompt = @"MYDOS C:\>"; // 修改提示符
WriteProtectedPrompt();
}
这个条件根本就没满足,没有运行哪?
我在里面加了测试,
if (richTextBox1.TextLength > 0 && richTextBox1.Text[richTextBox1.TextLength - 1] == '\n')
{
MessageBox.Show("kk");
没有弹出提示框
wartim 2009-04-23
  • 打赏
  • 举报
回复
我试出来了,用richtextbox完全可以符合你的要求
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication35
{
public partial class Form1 : Form
{
String Prompt = "MYDOS>";

public Form1()
{
InitializeComponent();

WriteProtectedPrompt();
}

void WriteProtectedPrompt()
{
int Start = richTextBox1.TextLength;
richTextBox1.AppendText(Prompt);
richTextBox1.SelectionStart = Start;
richTextBox1.SelectionLength = richTextBox1.TextLength - Start;
richTextBox1.SelectionFont = new Font("宋体", 10);
richTextBox1.SelectionColor = Color.Blue;
richTextBox1.SelectionProtected = true; // 提示符部分是受保护的,无法修改
richTextBox1.SelectionStart = richTextBox1.TextLength;
}


void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
richTextBox1.SelectionColor = Color.Black;
if (e.KeyData == Keys.Up)
e.SuppressKeyPress = true; // 屏蔽向上按键
if (e.KeyData == Keys.Left && richTextBox1.TextLength > 1)
{
int Current = richTextBox1.SelectionStart;
richTextBox1.SelectionStart = richTextBox1.SelectionStart - 1;
richTextBox1.SelectionLength = 1;
if (richTextBox1.SelectionProtected) // 如果是向左按键,则检查左边那个字符是不是受保护的
e.SuppressKeyPress = true; // 如果是受保护的就屏蔽这次向左操作,不允许向左
richTextBox1.SelectionStart = Current;
richTextBox1.SelectionLength = 0;
}
}

void richTextBox1_TextChanged(object sender, EventArgs e)
{
if (richTextBox1.TextLength > 0 && richTextBox1.Text[richTextBox1.TextLength - 1] == '\n')
{
if (richTextBox1.Text.ToUpper().LastIndexOf(@"CD C:\") > 0) // 随便举个例子
Prompt = @"MYDOS C:\>"; // 修改提示符
WriteProtectedPrompt();
}
}
}
}
yhxxy 2009-04-23
  • 打赏
  • 举报
回复
自己顶啊
yhxxy 2009-04-23
  • 打赏
  • 举报
回复
to wartim :
你这样还是不行啊,你这种实现是用两个文本框,但是因为是命令行,我需要根据用户输入命令不同进行判断,在命令标识符前的内容是需要变化的
假如以DOS命令为例,输入CD C:,那么前面就要变成C:>,如果此时再输入CD 文件夹名称,那么前面就要显示C:/文件夹名称>
这时就不行了
lijizun 2009-04-23
  • 打赏
  • 举报
回复
学习一下!
wartim 2009-04-23
  • 打赏
  • 举报
回复
考完了你把richTextbox的KeyDown和TextChanged事件绑定上去了没有
yhxxy 2009-04-23
  • 打赏
  • 举报
回复
我就是新建项目测试的,把你的代码拷贝进去后运行没有反应,然后就在
if (richTextBox1.TextLength > 0 && richTextBox1.Text[richTextBox1.TextLength - 1] == '\n')
下面加了一行测试,结果证明没运行啊
xufzu123 2009-04-21
  • 打赏
  • 举报
回复
学习了~有点像命令输入框~
高效匠人 2009-04-21
  • 打赏
  • 举报
回复
学习
yhxxy 2009-04-21
  • 打赏
  • 举报
回复
谢谢,我参考一下,
wartim 2009-04-21
  • 打赏
  • 举报
回复
当操作一页时还有点小问题,你改下吧,这样光标就移动不到提示部分了,完全分离,如果提示部分能做到兼顾enabled=false的连光标都不能点击效果又能保持白色底色就更像了
wartim 2009-04-21
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication31
{
public partial class Form1 : Form
{
TextBox Prompt = new TextBox();
TextBox Edit = new TextBox();

public Form1()
{
InitializeComponent();

this.Controls.Clear();
this.Size = new Size(500, 500);

Prompt.Multiline = true;
Prompt.ReadOnly = false;
Prompt.TabStop = false;
Prompt.BorderStyle = BorderStyle.None;
Prompt.Parent = this;
Prompt.Size = new Size(50, this.Size.Height);
Prompt.Location = new Point(0, 0);
Prompt.Text = "Prompt>";

Edit.Multiline = true;
Edit.ScrollBars = ScrollBars.Vertical;
Edit.BorderStyle = BorderStyle.None;
Edit.Parent = this;
Edit.Size = new Size(this.ClientSize.Width - Prompt.ClientSize.Width, this.ClientSize.Height);
Edit.Location = new Point(Prompt.Width, 0);
Edit.KeyDown += new KeyEventHandler(Edit_KeyDown);
Edit.TextChanged += new EventHandler(Edit_TextChanged);
Edit.Focus();
}

void Edit_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Up)
e.Handled = true;
}

void Edit_TextChanged(object sender, EventArgs e)
{
if (Edit.Lines.Length > Prompt.Lines.Length)
Prompt.Text += Environment.NewLine + "Prompt>";
else if (Edit.Lines.Length < Prompt.Lines.Length)
{
Edit.Text += Environment.NewLine;
Edit.SelectionStart = Edit.TextLength;
}
}
}
}
yhxxy 2009-04-21
  • 打赏
  • 举报
回复
一楼的方法我试过了,就是会出现我说的问题啊.
我现在做的是一个命令行工具,要求输入相应命令后,界面发生相应变化,但光标要始终定位在"具体内容>"的后面
现在的问题是光标总是跑到下一行的开头去
yhxxy 2009-04-21
  • 打赏
  • 举报
回复
1楼的方法我也用了,就是会出现我上面说的情况啊
我要做的就是一个命令行输入的界面,要保证每次输入命令后,界面有相应变化,但光标要定位在"具体内容>"的后面
可现在就是每次光标都跑到下一行的头上了
wartim 2009-04-21
  • 打赏
  • 举报
回复
晕倒,有什么区别吗,为什么一定要按回车时就判断,那就用1楼的办法
yhxxy 2009-04-21
  • 打赏
  • 举报
回复
但是我的要求是要在按回车时,才判断,而不是文本框的内容发生变化时判断,
我把你上面的事件换成KeyDown后,并加入if (e.KeyValue == 13)判断后,还是无法实现.
uncleson88 2009-04-21
  • 打赏
  • 举报
回复
1楼正确!
加载更多回复(15)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧