2012-03-10 36 views
2

フォーム上のデータソースにバインドされた標準のDataGridViewを持つWindowsフォームVS2010 .NET 4プロジェクトがあります。WinFormsのDataGridView編集セル

グリッドには、クリックされた文字をポイントにして編集したいテキスト列があります。 通常のテキストボックス/エディタのように、調整したい文字をクリックします。可能であれば、UP/DOWNキーを使用して行間を移動したいが、テキスト全体を選択することなく同じ列内の同じ文字位置にカーソルを移動したいと思う。

私はいくつか試してみました

DataGridView1.ClearSelectionを()

DataGridView1.BeginEdit(偽)

にBeginEditはちょうど別のものを意味し、テキストの末尾にカーソルを置きますクリックして編集用の文字位置をポイントします。

デベロッパーエクスプレッションのような商用のグリッドは、デフォルトでクリックするだけで正しい文字位置をクリックすることができますが、明らかに費用がかかります。

私はDataGridView1_EditingControlShowingイベント

If TypeOf e.Control Is System.Windows.Forms.DataGridViewTextBoxEditingControl Then 
     Dim tb As TextBox = e.Control 
     tb.SelectionStart = 5 
     tb.SelectionLength = 5 
End If 

で試してみました。しかし、これは何もしません。

調整が必要な文字の位置に移動するには、2回または3回のクリックを取り除こうとしています。

私はカスタムデータ列をまだ見ていません。

ご意見をいただければ幸いです。

答えて

2

これを行うための方法はありません。その中で最も近いのは、グリッドのEditModeEditOnEnterに設定することですが、これは3回ではなく2回のクリックが必要なことを意味します。

独自の列タイプを記述する必要があります。

誰かがちょうどそれをしたhere

その例は、アップハンドルとダウン場合、私はチェックしていません - それは、あなたは、したselectionStartとSelectionLengthプロパティを正しい軌道に乗っていただけで、あなたが残しているセルのキャレット位置を取得し、それを適用していない場合新しいセルに移動します。 (私はすでにMaskedTextBoxのカスタム列タイプ私はこれをしなかった最後の時間を使用していた可能性があるため)


これは、これらのプロパティを設定することは、私が覚えていることを少しより複雑であることが判明しました。

以下のコード(vb.Netの原則はvb.Netを保持し、自分で変換できない場合はvbコードを与えることができます)はうまく機能しますが、カスタムコントロールに入れて整理できますが「練習として残しておきでしょう:)

まず私はEditingControlShowingイベントのハンドラを追加します。current_control上記の方法で

void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    DataGridViewTextBoxEditingControl t = e.Control as DataGridViewTextBoxEditingControl; 
    current_control = t; 
    t.Leave += new EventHandler(t_Leave); 
} 

は、フォームレベルのプライベート変数です。

void t_Leave(object sender, EventArgs e) 
{ 
    cell_caret_pos = current_control.SelectionStart; 
} 

この場合も、クラスレベルのプライベートフィールド-cell_caret_posがあります。

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) 
{ 
    dataGridView1.BeginEdit(false); 
    DataGridViewTextBoxEditingControl editControl = 
     (DataGridViewTextBoxEditingControl)dataGridView1.EditingControl; 

    if (cell_caret_pos != 0) 
    { 
     editControl.SelectionStart = cell_caret_pos; 
     editControl.SelectionLength = 0; 
    } 
} 
+0

優秀な答えは主ビットをし、私はこれを探していた年齢のために:私はそれはあなたがCellEnterイベントハンドラ内で作業する必要があるたselectionStartとSelectionLength設定することがわかったその後何

。それは上向きのビットをしませんが、私はそれを修正することができるかもしれません。前のセルを取得するためのアイデア。 –

+0

私はちょうどこの非常に迅速にコンセプトを証明しました。(エディットコントロールの表示から)フォームレベルのプライベート変数に配置し、編集コントロールのleaveイベント中にSelectionStart値をフォームレベルのint変数に配置することによって、その後、グリッドの外にいったん私はintをチェックし、それは最後の編集コントロール位置を持っていました。あなたがそのサンプルのサブクラス化されたdgvに非常に簡単に似たようなものを置くことができるように、私はテストするために1分しかかかりませんでした。 –

+0

Davidさん、ありがとうございました。私はキャレット位置を持っていますが、上下の矢印を使用すると次の行で編集モードにならないので、編集を設定してキャレットの位置を変更する方法がわかりません。私はEditOnEnterにEditModeを設定しようとしましたが、これはマウスのワンクリック編集を防ぎます。ニューカッスルのごめんなさい... –

関連する問題