2009-03-02 47 views
0

TextBoxの行の追加または削除をユーザーが防ぐ方法を教えてください。つまり、テキストボックス内のテキストをテキストで7行に設定すると、そのテキストが常に7行のテキストになるようにするにはどうすればいいですか?ユーザーはいつものようにこれらの行を編集できる必要がありますが、行を完全に削除することはできず、新しい行を追加することはできません。TextBoxに行を追加/削除しないようにするにはどうすればよいですか?

など、考慮にキーボード入力し、また、カット&ペーストのようなものの両方を取るために何かいいアイデアを持っていますか?


理由:私はOscar's Renamerなどをファイルリネームのようなものを作りたいです。あなたはそれにフォルダを与え、テキストエディタのように変更を加えることができるテキストボックスにファイル名をロードします。変更に満足したら、それらを書き戻します。テキストボックスの定数n行の理由はもちろん、nという行はファイルnの名前です。そのフォルダ内にこれらのファイルしかないので、新しい行を追加することはできません。行の削除も許されません。なぜなら、ファイルの名前が失われてしまうからです。

既に存在する場合、このようなことをするのはどうしてですか?まあ、私はそれをすることができるかどうかを知りたいと思っていて、道に沿っていくつかのことを学ぶのは素晴らしい運動です。それには解決すべきいくつかの興味深い問題があるので。このように:)また、私はそれに欠けていると思ういくつかの機能がありますOscar's Renamer。だから...まとめてみよう:私はそれを学び、より良いバージョンを作りようとしている。私は完全によく知っているが、私はちょうど完全に失敗するかもしれないし、それを終わらせないかもしれない:pしかしそれは別の話である。私は学びたい

+0

開平、brodernを - MA SEオングストロームkommeは、PA WPF、獣医デュ上度。 Da bruker du listbox med editboks私は項目を変更しました: - D – Vegar

+0

men kan du redigere som i en textbox da? – Svish

答えて

1

可能な方法の1つは、Textboxコントロールをサブクラス化してwinProcメソッドをオーバーライドすることです。このメソッドは、ウィンドウコントロール(あなたのケースのテキストボックス)にポンピングされたすべてのウィンドウメッセージを処理します。バックスペースの使用を監視し、キーとカラットの位置を削除し、キャリッジリターンラインフィードシーケンスを削除しようとするキーストロークを破棄することができます。また、回線全体を削除できない理由を示す対話型アラートをユーザーに提供します。

このようにすると、完全に制御でき、すべての入力がテキストボックスコントロールに入力されることを確認する最も低いレベルの方法です。特定のメッセージを傍受して破棄することができます。これらのメッセージは、基本クラスのメソッドに渡すだけです。たとえば、ユーザーがすべての行をハイライト表示し、削除キーをヒットするとします。キーボード入力を傍受するために使用できる他のイベントハンドラがありますが、いくつかの制限があります.WeeProcは、削除、バックスペースのコピーとペーストなど、マウスのクリックなど、コントロールへのメッセージを確認できます。

サンプル:

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

あなたはデータに対して間違ったインターフェースを持っています。この場合、データの行ごとに1つのテキストボックスが固定されている必要があります。これにより、ユーザーは各行の内容を変更できますが、行を削除したり、行を追加することはできません。

複数行のテキストボックスを作成しようとすると、改行が追加/削除された時点を判断してから変更を強制終了する必要があるため、これは最高の気分になります。

+0

あなたはアドバイスだけでなく、質問に対する答えを提供することができればよいと思います。 – Sung

+0

@ Sung Meister:答えです。 Svishは何をすべきかについてのアイデアを尋ねられ、彼はそれを与えられた。 – casperOne

2

私は、おそらくユーザーがテキストボックスで必要な操作を行えるようにしてから、ユーザーに7行以上になるとエラーが表示されるように検証を追加します(赤い輪郭やツールチップなど)。 7行以下の場合は問題ありません。データを処理するときに追加してください。

いつも7行が必要な具体的な理由は何ですか? casperOne氏のように、使用しているインターフェースがあなたのニーズに理想的ではないかもしれません。

3

なぜリストボックスを使用しないのですか?

1

これは学習プロジェクトであるとすでに言いましたので、私がプロジェクトを行うことができるかどうかを確認してください。あなたはWPFをその中に投げ入れるべきだと思います。 itemtemplateを持つリストボックスは、これを非常にうまく解決します。

このような場合は、テキストボックスの代わりにデータグリッドを使用することを検討します。

+0

ですが、テキストボックスのようにテキストを編集できますか?別のテキストボックスで編集するようなものではないでしょうか?それはエクスプローラのように別々に編集するようなものでしょうか?それは私が避けたいものですか? – Svish

+0

各リストアイテムに対して1つのテキストボックスがありますが、それはエクスプローラでの編集とは異なります。すべてのアイテムは、編集中のアイテムだけでなく、テキストボックスになります。 – Vegar

0

TextBoxの代わりに編集可能な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; }  
    } 
} 
関連する問題