非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

C#: TextBoxやRichTextBox: 複数行選択+「Tab」キーで一括でTabを入れる方法

   

テキストエディターの標準的な機能でもあるのですが、テキストを複数行選択して「Tab」キーを押すと、その行すべてにTabが入ります。また、「Shift」+「Tab」キーでTabが消えていくという機能があります。その作り方の紹介です。

こんなやつです。↓

※GIFアニメはこちらで作成しました。

[ad#top-1]

まず複数選択時にTab機能を受け付けないようにする

複数選択してTabキーを押すと、そのテキストは消えてTabが入ってしまいます。

まずは、複数選択時にTab機能を受け付けないようにする必要があります。

private void keyPressed(object sender, KeyPressEventArgs e){
  if(e.KeyChar == "\t"[0] && textBox.SelectionLength>0) e.Handled=true;
}

/*
textBoxにKeyPressEventHandlerをあてています。
textBox.KeyPress += new KeyPressEventHandler(keyPressed);
*/
 

 

複数行選択の状態で「Tab」キー押すと一括Tab挿入

こちらが「Tab」キー押して一括Tab挿入するソースコードです。

private void keyDowned(object sender, KeyEventArgs e){
  //[Tab]キー
  if(e.KeyCode == Keys.Tab && textBox.SelectionLength>0 && !e.Shift){
    // 選択した行をすべて包む
    string text = textBox.Text + "\n";
    int selectstart = textBox.SelectionStart-1;
    if(selectstart<0) selectstart=0;
    int st = text.LastIndexOf("\n", selectstart) + 1;
    int en = text.IndexOf("\n", textBox.SelectionStart+textBox.SelectionLength-1);
    textBox.Select(st, en-st);
    text = textBox.SelectedText;
    //先頭にTab挿入
    text = "\t" + text;
    int pos=0;
    for(;;){
      pos = text.IndexOf("\n", pos);
      if(pos<0) break;
      text = text.Insert(pos+1, "\t");
      pos+=2;
    }
    //TextBoxに修正済みテキスト挿入
    textBox.SelectedText = text;
    textBox.Select(st, text.Length);
  }
}
/*
textBoxにKeyEventHandlerをあてています。
textBox.KeyPress += new KeyPressEventHandler(keyPressed);
*/
 

 

複数行選択の状態で「Shift」+「Tab」キー押すとTab削除

こちらが「Shift」+「Tab」キー押してTab削除するソースコードです。上のkeyDownedメソッド内に挿入してください。

//[Shift]+[Tab]キー
if(e.KeyCode == Keys.Tab && textBox.SelectionLength>0 && e.Shift){
  // 選択した行をすべて包む
  string text = textBox.Text + "\n";
  int selectstart = textBox.SelectionStart-1;
  if(selectstart<0) selectstart=0;
  int st = text.LastIndexOf("\n", selectstart) + 1;
  int en = text.IndexOf("\n", textBox.SelectionStart+textBox.SelectionLength-1);
  textBox.Select(st, en-st);
  text = textBox.SelectedText;
  //Shift+Tabキーなら先頭のTab削除
  if(text.Substring(0, 1)=="\t") text = text.Remove(0, 1);
  text = text.Replace("\n\t", "\n");
  //TextBoxに修正済みテキスト挿入
  textBox.SelectedText = text;
  textBox.Select(st, text.Length);
}
 

 

ソースコード全文

ソースコード全文はこちらです。

Windows APIでフォントが勝手に変わらない処置と、タブサイズを3に設定しています。

 

[ad#ad-1]

スポンサーリンク

 - C#応用編