2

「テキストブロック」を追加できるテキストボックスが欲しいのですが。「テキストブロック」の定義は次のとおりです。

  • ブロックの一部であるテキストボックス内の文字を削除すると、ブロック全体が削除されます。
  • ブロック全体が選択されるようにするブロックの一部である場所のテキストボックスでニンジンの位置を設定します。
  • ユーザーがブロックの途中に文字を書き込もうとすると失敗し、その後に適切なメッセージボックスが表示されます。

CellClickイベントがアタッチされたDataGridViewがあります。CellClickイベントが発生すると、セルのコンテンツがテキストボックスに配置され、テキストブロックと見なされるようにしたいと思います。追加されたブロックの場所は、テキストボックスのキャロット位置、またはテキストボックスにフォーカスがなく、キャロットが点滅していない場合はテキストボックスの最後になります。

また、テキストボックスが通常のテキストボックスとして機能することも必要です。つまり、ユーザーは、上記で定義したように完全に追加/削除する必要があるテキストブロックを除いて、必要な文字/テキストを追加または削除できます。

このミッションを達成するには、テキストボックス以外のGUIコントロールを使用する必要があるかもしれません。わかりません。

私はいくつかの解決策について考えましたが、どれが最良かわかりません(おそらくそれらのどれも):(備考:以下の解決策のそれぞれは、KeyPressイベントが添付されていることを前提としています)

  1. 各ブロックの前後に非表示の文字を追加して(可能な場合)、ブロックをマークします。
  2. すべてのテキストブロックを表すオブジェクトのリストを作成します。各オブジェクトには、startIndex、endIndexの2つのフィールドが含まれています。テキストボックスから文字を追加または削除するには、追加/削除された文字の後にあるブロックのすべてのインデックスを、文字ごとに+1または-1ずつ更新する必要があるため、あまり良くありません。
  3. テキストボックス内のすべてのテキストを表すオブジェクトのリストを作成します。各オブジェクトには、text、flagの2つのフィールドが含まれています。文字が手動で追加されるか、イベントによって単語が追加されるたびに、オブジェクトがリストに追加され、オブジェクトのテキストフィールドが追加された文字に設定され、文字が単語の場合、オブジェクトのフラグファイルがtrueに設定されますイベントによって追加されるか、それ以外の場合はfalse。
  4. テキストボックスを2つの部分に分割し、イベントによって追加されたテキストブロックごとにそれらの間に小さなテキストボックスを作成し、小さなテキストボックスを異なる方法で処理します。小さなテキストボックス内のテキストが削除されると、テキストボックスコントロール全体が削除され、分割されたテキストボックスが統合されます。あまりよく聞こえません。

これを実装するための最良の方法は何ですか?

ありがとう!

4

1 に答える 1

1

私はこの振る舞いでコントロールを見たことがありません。誰かが書いたのではなく、ありそうもないというだけです。これは、それを構築する必要があることを意味します。

カスタムコントロールを作成したことがない場合は、Webで「カスタムWinFormsコントロールの作成」などを検索してください。まず、基本的なテクニックを理解する必要があります。

次に、編集のために基になるテキストを保存する方法を知りたいと思うでしょう。標準のテキスト編集コントロールに一般的に使用されるテクニックのいくつかを学ぶことから始めることができます。カスタムシナリオ用に変更できるものを1つ選択してください。これが私の頭のてっぺんからいくつかです:

ギャップバッファ

ロープ

ピースチェーン

幸運を!

于 2012-07-12T19:40:59.130 に答える