2009-03-02 59 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; }  
    } 
} 
相關問題