WinForms でセルを編集する DataGridView
-
11-12-2019 - |
質問
フォーム上のデータソースにバインドされた標準の DataGridView を備えた Windows Form VS2010 .NET 4 プロジェクトがあります。
グリッドにはテキスト列があり、これをポイントにして、クリックした文字で編集します。通常のテキストボックス/エディターと同様に、調整したい文字をクリックします。可能であれば、上/下キーを使用して行間を移動したいのですが、テキスト全体を選択せずに、カーソルを同じ列の同じ文字位置に明らかに移動したいと考えています。
私はいくつかのことを試してみました:
DataGridView1.ClearSelection()
DataGridView1.BeginEdit(False)
BeginEdit はカーソルをテキストの末尾に置くだけです。これは、編集する文字位置をポイントするためにもう一度クリックすることを意味します。
DevExpress のような商用グリッドでは、ワンクリックで正しい文字位置にクリックできる編集がデフォルトになっているのは知っていますが、明らかにコストがかかります。
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 回のクリックを削除しようとしているだけです。
Custom DataColumn についてはまだ見ていません。
ご提案をいただければ幸いです。
解決
これを行うためのすぐに使える優れた方法はありません。最も近いのは、 EditMode
グリッドの EditOnEnter
しかし、それは、3 回ではなく 2 回のクリックだけで済むことを意味します。
独自の列タイプを作成する必要があります。
誰かがまさにそれをやった ここ.
この例が上下に処理するかどうかは確認していません。もしそうでない場合は、SelectionStart プロパティと SelectionLength プロパティを使用して正しい方向に進んでいることになります。終了するセルのキャレット位置を取得して、それを新しいセルに適用するだけです。 。
これらのプロパティの設定は、私が覚えていたよりも少し複雑であることがわかりました (おそらく、前回これを行ったときにすでに MaskedTextBox カスタム列タイプを使用していたためでしょう)。
以下のコード (C# ですが、原則は vb.Net にも当てはまり、自分で変換できない場合は vb コードを提供できます) は問題なく動作します。カスタム コントロールに入れることで整理できますが、それはそのままにしておきます。練習として:)
まず、EditingControlShowing イベントのハンドラーを追加します。
void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridViewTextBoxEditingControl t = e.Control as DataGridViewTextBoxEditingControl;
current_control = t;
t.Leave += new EventHandler(t_Leave);
}
上記のメソッドでは、current_control はフォーム レベルのプライベート変数です。t のイベント ハンドラーは次のようになります。
void t_Leave(object sender, EventArgs e)
{
cell_caret_pos = current_control.SelectionStart;
}
ここにもクラス レベルのプライベート フィールド、cell_caret_pos があります。
次に、SelectionStart と SelectionLength を設定するには、CellEnter イベント ハンドラー内で作業する必要があることがわかりました。
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;
}
}