2009-03-02 85 views
0

如何防止用户添加或删除文本框中的行?我的意思是,如果我将文本框中的文本设置为带有文本的7行,如何确保它始终是7行文本?用户必须能像往常一样编辑这些行,但不能完全删除一行,也不能添加任何新行。如何防止用户添加/删除文本框中的行?

必须兼顾键盘输入和还搞什么剪切和粘贴等

什么好的建议?


原因:我想打一个文件更名有点像Oscar's Renamer。你给它一个文件夹,它将文件名加载到一个文本框中,你可以像在文本编辑器中一样进行更改。当你对自己的改变感到满意时,你就把它们写回来。当然,在文本框中不断n行的理由当然是那条行n是文件n的名称。不应该允许添加新行,因为您只有该文件夹中的这些文件。删除一行也不应该被允许,因为你会错过一个文件的名字。

为什么要经历这样的事情,当它已经存在的麻烦?那么,我很好奇我是否能够做到这一点,并认为这可能是一个很好的练习,可以学习一些事情。因为它有一些有趣的问题需要解决。喜欢这个:)也有一些功能,我认为缺乏那Oscar's Renamer。所以......总结一下:我正在学习并尝试制作更好的版本。我完全清楚,尽管我可能完全失败,或者只是永远不会完成它:p但那是另一回事。我想学习

+0

平,brodern - MA知的komme DEG超过PåWPF,兽医渡。 Da bruker du listbox med editboks我hvert item :-D – Vegar 2009-03-02 19:18:15

+0

男士可以在我的文本框da? – Svish 2009-03-08 14:57:16

回答

1

这样做的一种可能方式是对Textbox控件进行子类别重写并覆盖winProc方法。此方法处理所有窗口消息被泵送到窗口控件(在你的案例中的文本框)。您可以监视退格的使用并删除钥匙和克拉位置,并放弃尝试删除回车换行序列的击键。并向用户提供交互式警报,告诉他们为什么不能删除整行。

这样做可以让您完全控制,并且是最低级别的方式,可以看到全部输入进入您的文本框控件。你可以拦截某些消息并丢弃它们,你想让它们传递给基类方法。例如,如果用户突出显示所有行并点击删除键。还有其他事件处理程序可用于拦截键盘输入,但它们有一些限制,winProc将允许您检查指向该控件的任何消息,包括删除,退格复制和粘贴等,鼠标单击等。

样本:

public class myCustomTextBox : TextBox 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 770) // window paste message id 
     { 
      string clipBoardData = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString(); 
      handlePasteEvent(clipBoardData); 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
    private void handlePasteEvent(string pasteData) 
    { 
     // process pasted data 
    } 
} 
6

然后对于数据您有错误的接口。在这种情况下,您应该有一个固定数量的文本框,每行数据一个。这将允许用户修改每一行的内容,但不能删除一行或添加一行。

试图制作一个多行文本框这样做会令人发狂,因为您必须确定何时添加/删除新行然后终止更改。

+0

我认为如果您还可以提供问题的答案,而不仅仅是建议,那么最好。 – Sung 2009-03-02 20:26:47

2

我可能会让用户在文本框上做他们想要的,然后添加验证以显示用户在7行以上时出现错误(例如红色轮廓和工具提示或其他内容)。如果它们在7行以内,没有问题,请在处理该数据时添加它们。

你希望总是7行的具体原因是什么?就像casperOne所说的,也许你使用的界面对你的需求并不理想。

3

为什么不使用Listbox呢?

1

既然你已经说过这是一个学习项目,看看我是否可以做到 - 项目,我认为你应该投入一些WPF。带有itemtemplate的列表框可以很好地解决这个问题。

如果这样,我会考虑使用数据网格而不是文本框。

0

加载一个可编辑的DataGrid,而不是一个文本框,应该让事情变得更简单的数据,还可以选择哪些列是可编辑的,哪些不是。

这是一个使用一个DataGridView和模拟你的文本框的例子:

  • 网格线是隐藏的。
  • 隐藏了列和行的标题。
  • 背景颜色与TexBox具有相同的颜色。

添加一个DataGridView到表单并使用以下代码:

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; 
using System.IO; 

namespace Test 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      this.dataGridView1.AllowUserToResizeRows = false; 
      this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; 
      this.dataGridView1.BackgroundColor = SystemColors.Window; 
      this.dataGridView1.BorderStyle = BorderStyle.None; 
      this.dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None; 
      this.dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; 
      this.dataGridView1.ColumnHeadersVisible = false; 
      this.dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; 
      this.dataGridView1.MultiSelect = false; 
      this.dataGridView1.RowHeadersVisible = false; 
      this.dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView1_SelectionChanged); 

      dataGridView1.DataSource = Directory.GetFiles(Environment.CurrentDirectory).Select(f => new FileEdit { FileName = Path.GetFileName(f) }).ToList(); 
     } 

     private void dataGridView1_SelectionChanged(object sender, EventArgs e) 
     { 
      dataGridView1.BeginEdit(true); 
     } 

    } 

    class FileEdit 
    { 
     public string FileName { get; set; }  
    } 
}