C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: DataGridViewのセルの内容の一部をコピー


(過去ログ 98 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■58420 / inTopicNo.1)  DataGridViewのセルの内容の一部をコピー
  
□投稿者/ ローラレイ (1回)-(2011/04/04(Mon) 15:20:34)

分類:[VB.NET/VB2005 以降] 

こんにちは。
DataGridView(VB2008)のセル内のテキストの一部をクリップボードにコピーしたいのですが、
そのセルの内容は変更したくありません。
DataGridViewとその列のReadOnlyプロパティをFalseにすればセル内のテキストの一部を
選択・コピーできますが、そのセルを編集できてしまいます。
また、ReadOnlyプロパティをTrueにすると、テキストの一部の選択すらできません。
何かいい方法はありませんでしょうか?
※たとえば、テキスト編集中はキーボード入力を禁止するなど?
引用返信 編集キー/
■58423 / inTopicNo.2)  Re[1]: DataGridViewのセルの内容の一部をコピー
□投稿者/ しるふぃん (9回)-(2011/04/04(Mon) 17:13:28)
No58420 (ローラレイ さん) に返信

たとえば・・・。
どの行のどのセルかは現在でも指定してからクリップボードにコピーですよね?

であれば
FullRowSelect = True
MultiSelect = False
で1行のみの選択にして、SelectedItems(0).Subitems(*)でコピーしたい
セルの場所を指定すればいけるんじゃないかな?(SelectedItems(0)は常に選ぶのは行単位の1行しかできないから)

このやり方だと特にReadOnlyプロパティを気にせずにできる・・・かも・・・?

引用返信 編集キー/
■58430 / inTopicNo.3)  Re[2]: DataGridViewのセルの内容の一部をコピー
□投稿者/ ローラレイ (2回)-(2011/04/04(Mon) 20:09:46)
No58423 (しるふぃん さん) に返信
> FullRowSelect = True
> MultiSelect = False
> で1行のみの選択にして、SelectedItems(0).Subitems(*)でコピーしたい
> セルの場所を指定すればいけるんじゃないかな?(SelectedItems(0)は常に選ぶのは行単位の1行しかできないから)
>
> このやり方だと特にReadOnlyプロパティを気にせずにできる・・・かも・・・?

ありがとうございます。
この方法で、どのようにしてセル内のテキストの一部を選択・コピーすればよいのでしょうか?
引用返信 編集キー/
■58433 / inTopicNo.4)  Re[3]: DataGridViewのセルの内容の一部をコピー
□投稿者/ じゃんぬねっと (63回)-(2011/04/05(Tue) 02:47:45)
じゃんぬねっと さんの Web サイト
No58430 (ローラレイ さん) に返信
> ありがとうございます。
> この方法で、どのようにしてセル内のテキストの一部を選択・コピーすればよいのでしょうか?

Cell が編集状態になった場合のお話ではないので無理でしょう。
(私が無知なだけかもしれませんが...)

ReadOnly が False でないと編集状態にならないので、変更を禁止するコードを記述するしかないかもしれませんね。

他の 3rd パーティ製品の Grid コントロールであれば、ReadOnly (選択は可能だが変更不可) と Static (選択さえ不可) といったように意味合いが分かれていたりして便利なのですが...
ということで、Text の内容を常に保つ意味を持つプロパティを DataGridViewTextBoxCell を拡張するのが良いかもしれませんね。
引用返信 編集キー/
■58435 / inTopicNo.5)  Re[4]: DataGridViewのセルの内容の一部をコピー
□投稿者/ しるふぃん (10回)-(2011/04/05(Tue) 06:57:06)
あぁ。テキストの一部でしたか・・・。
申し訳ない(。。
早とちりも甚だしいですよね・・・。

じゃんぬさんが言うとおり、変更を禁止するコードを記述するしかないかもしれません。。。

今後このようなことがないように気をつけますorz



引用返信 編集キー/
■58439 / inTopicNo.6)  Re[4]: DataGridViewのセルの内容の一部をコピー
□投稿者/ ローラレイ (3回)-(2011/04/05(Tue) 09:58:49)
>じゃんぬねっと さん
コメントありがとうございます。

> ReadOnly が False でないと編集状態にならないので、変更を禁止するコードを記述するしかないかもしれませんね。
>
> 他の 3rd パーティ製品の Grid コントロールであれば、ReadOnly (選択は可能だが変更不可) と Static (選択さえ不可) といったように意味合いが分かれていたりして便利なのですが...
> ということで、Text の内容を常に保つ意味を持つプロパティを DataGridViewTextBoxCell を拡張するのが良いかもしれませんね。

やっぱりそうですか。
例えば、イメージとしてはセルの中にReadOnlyのWindows.Forms.TextBoxのようなものが表示され、
セル選択など関係なくテキストボックス内を選択できればいいのですが。
ReadOnlyでいいので、WebBrowserのようなものでもいいと思いますが、このような継承を行った方はいらっしゃいますか?


>しるふぃんさん

いえいえ。ありがとうございます。
また何か分かることがありましたら、どうぞお願いします。
引用返信 編集キー/
■58445 / inTopicNo.7)  Re[5]: DataGridViewのセルの内容の一部をコピー
□投稿者/ ローラレイ (4回)-(2011/04/05(Tue) 12:41:03)
自己レスですが、以下のサイトを参考に、キー入力規制をしてみました。

http://dobon.net/vb/dotnet/datagridview/textboxevent.html

KeyPressイベントでは、Ctrl+Cの場合、e.KeyCharのコードが&H3だったので、これ以外を無視するようにしました。
これだけだとDelキーやバックスペースキーに反応するので、参考ソースにKeyDownイベントハンドラを追加し、
ここでキー反応を無視するようにしました。

    'EditingControlShowingイベントハンドラ
    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
            ByVal e As DataGridViewEditingControlShowingEventArgs) _
            Handles DataGridView1.EditingControlShowing
        '表示されているコントロールがDataGridViewTextBoxEditingControlか調べる
        If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then
            Dim dgv As DataGridView = CType(sender, DataGridView)

            '編集のために表示されているコントロールを取得
            Dim tb As DataGridViewTextBoxEditingControl = _
                CType(e.Control, DataGridViewTextBoxEditingControl)

            'イベントハンドラを削除
            RemoveHandler tb.KeyDown, AddressOf dataGridViewTextBox_KeyDown
            RemoveHandler tb.KeyPress, AddressOf dataGridViewTextBox_KeyPress

            '該当する列か調べる
            If dgv.CurrentCell.OwningColumn.Name = "Column2" Then
                'KeyPressイベントハンドラを追加
                AddHandler tb.KeyDown, AddressOf dataGridViewTextBox_KeyDown
                AddHandler tb.KeyPress, AddressOf dataGridViewTextBox_KeyPress
            End If
        End If
    End Sub

    'DataGridViewに表示されているテキストボックスのKeyDownイベントハンドラ
    Private Sub dataGridViewTextBox_KeyDown(ByVal sender As Object, _
            ByVal e As KeyEventArgs)
        'KeyDownを無効にする
        e.Handled = True
    End Sub

    'DataGridViewに表示されているテキストボックスのKeyPressイベントハンドラ
    Private Sub dataGridViewTextBox_KeyPress(ByVal sender As Object, _
            ByVal e As KeyPressEventArgs)
        'Ctrl+C以外は無視する
        If Asc(e.KeyChar) <> &H3 Then
            e.Handled = True
        End If
    End Sub

これでキー入力については制御できそうですが、何か気になる点がありましたらご指摘頂けますでしょうか?
(なお、右クリックで表示されるコンテキストメニューについては今は置いておきます。)

引用返信 編集キー/
■58448 / inTopicNo.8)  Re[6]: DataGridViewのセルの内容の一部をコピー
□投稿者/ ローラレイ (6回)-(2011/04/05(Tue) 16:38:45)
No58445 (ローラレイ さん) に返信
KeyPressやKeyDownのイベントハンドラを考慮しなくとも、EditingControlShowingイベントハンドラ内で
対象テキストボックス(e.Control)のReadOnlyをTrueにしてあげれば、
テキスト選択はできるが編集不可ということを実現できることが分かりました。
これにて解決とします。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -