2013-04-23 70 views
1

我有一個WinForms應用程序,其窗體上有一個RichTextBox控件。現在,我將AcceptsTabs屬性設置爲true,以便當選項卡被命中時,它將插入一個製表符。將製表符轉換爲RichTextBox中的空格

我想,雖然做的是讓這個當標籤被擊中,4位被插入一個\t製表符(我使用的是等寬字體)來代替。我怎樣才能做到這一點?

+1

使用控件上的按鍵事件來抑制'\ t'並在其位置插入''。 – 2013-04-23 23:53:17

回答

2

添加一個新的類重寫你的RichTextBox

class MyRichTextBox : RichTextBox 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if(keyData == Keys.Tab) 
     { 
      SelectionLength = 0; 
      SelectedText = new string(' ', 4); 
      return true; 
     } 

     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

然後,您可以拖動你的新控件到窗體的設計視圖:

注:不像用@ LarsTec的回答,這裏不需要設置AcceptsTab

+0

這個解決方案運行良好,但有沒有辦法讓它像一個選項卡一樣「行動」?這意味着如果我輸入兩個字符,然後點擊標籤,普通標籤只會移動2個空格。如果我再次打開標籤,它會移動它4個空格。您的解決方案使其始終插入4個空格。你明白我的意思嗎? – Icemanind 2013-04-24 00:11:29

+0

它幾乎就像我需要採取的行長,國防部4,然後添加那麼多的空間,而不是總是添加4 – Icemanind 2013-04-24 00:12:23

+0

@icemanind正是! ;) – 2013-04-24 00:13:00

6

隨着AcceptsTab屬性設置爲true,就嘗試使用KeyPress事件:

void richTextBox1_KeyPress(object sender, KeyPressEventArgs e) { 
    if (e.KeyChar == (char)Keys.Tab) { 
    e.Handled = true; 
    richTextBox1.SelectedText = new string(' ', 4); 
    } 
} 

根據您有關添加空間高達每四個字符的意見,你可以嘗試這樣的事:

void richTextBox1_KeyPress(object sender, KeyPressEventArgs e) { 
    if (e.KeyChar == (char)Keys.Tab) { 
    e.Handled = true; 
    int numSpaces = 4 - ((richTextBox1.SelectionStart - richTextBox1.GetFirstCharIndexOfCurrentLine()) % 4); 
    richTextBox1.SelectedText = new string(' ', numSpaces); 

    } 
} 
+0

比我的更好的解決方案,但AppendText不是解決它的方法。如果脫字號的位置不同於最後的位置呢?儘管你可以從我的回答中摘錄一些片段! – 2013-04-24 00:03:20

+0

@DannyBeckett沒想到通過。更新。 – LarsTech 2013-04-24 00:06:00

+0

還有一件事。 'richTextBox1.SelectionLength = 0;'也是必需的......如果用戶突出顯示某些內容,該怎麼辦? ;) – 2013-04-24 00:07:11

相關問題