DOBON.NET DOBON.NETプログラミング掲示板過去ログ

[.net2003]Datagridのコンテキストメニュー

分類:[.NET]

お世話になります。

行数固定のDataGridを右クリックしたときに、行の追加というメニューを出そうと
思っています。
機能としては・・・

例)
10行目で右クリック
11行目が生成される
生成される前の11行目を12行目に写す
生成される前の12行目を13行目に写す
・・・
最終行を削除する。

DataGridの行番号を変更すると使用しているArrayListとの整合が取れなくなって
例外落ちするので行番号が変わらないようにします。

ここで機能を未実装のままコンテキストメニューを追加してテストのためにビルド
してみたのですが、カレットの有る行では、コピーや貼り付けのメニューしか出ず、
コンテキストメニューで指定した項目が出てきません。
もうすこし調べてみると、カレットの無い行で右クリックすると、コンテキストメニューで
指定したメニューが出てきます。
編集機能としてコピー、ペースト等は欲しいですが、コンテキストメニューに指定
した項目が増えないのは問題です。
本にも載っていないのでMSDN見ながらの手探り状態で、フォームデザイナから追加
しただけの状態でまだコードは全く書いていませんが、どうしたら良いのでしょうか?
MouseUpイベントで行をセレクト状態にしてしまえばいいんじゃないでしょうか?
trapemiya様
素早い返答ありがとうございます。

> MouseUpイベントで行をセレクト状態にしてしまえばいいんじゃないでしょうか?
舌足らずでした。
現状では仮に選択状態でメニューが出せても、コンテキストメニューには行の追加
しかありません。
カレットの無い行を右クリックしたときはそこにカレットが移るようにするとして、
コピー、貼り付け、切り取り、削除の他にContextMenu1.MenuItems.Addで追加した
行の追加が欲しいのです。
無理ならこの4つを自力で実装になりますがそこまでレベルの高いことはちょっと
自分の腕では心もとないので出来ることなら現状のメニューに追加したいのです。

ありがとうございました。またお願いします。
> コピー、貼り付け、切り取り、削除の他にContextMenu1.MenuItems.Addで追加した
> 行の追加が欲しいのです。

これを応用するとできるかもしれません。

how can i add items to the contextMenu without removing the default items?
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=115086&SiteID=1
trapemiya様
素早い返信ありがとうございます。

>>コピー、貼り付け、切り取り、削除の他にContextMenu1.MenuItems.Addで追加した
>>行の追加が欲しいのです。
>
> これを応用するとできるかもしれません。
>
> how can i add items to the contextMenu without removing the default items?
> http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=115086&SiteID=1

英語でC#ですか
ちょっと検索サイトと職場にあるC#の本を見ながら解析してみます。
またお願いします。
技術的に難しいと言うことでコンテキストメニューじゃなくてボタンで良いことに
なりましたので、これにて解決とさせていただきます。
解明できて解決じゃないのが悔しいです(苦笑)
解決済み!
大変申し訳ないのですが、管理人として、幾つか指摘させていただきます。

まず、あおぞらさんは問題を解決したと思っていらっしゃるようですが、他の閲覧者から見ると、ご投稿いただいた問題は全く解決されていませんので、「解決済み」とすべきではありません。

また、閲覧者の方から回答をいただいたのに、それを検証し、報告することを全くせずに、ご自分の都合でスレッドを終了させようとするのは、あまりにも身勝手ではないでしょうか?(その「都合」がよほどのことであれば、別ですが。)これは、マナーとしてお願いしているフィードバックを拒否した行為といえます。ご自分の投稿した質問には、最後まで責任を持ってください。

厳しいことを言って申し訳ありませんが、以上をご理解していただき、今後投稿していただけますよう、お願いいたします。
2006/02/22(Wed) 10:09:47 編集(投稿者)

管理人様
いつも活用させていただいてありがとうございます。

ご指摘もっともであります。
以降解決済みチェックについては考えた上でチェックさせていただきます。

今回の件は結局自力では解決できなかったので、情報のフィードバックが
出来ませんでした。
仕事でやっているので仕様変更後はそれを置いてでも作業をしなくてはいけないのに、
ほかの人を放っておいて良いのか?と思い、今までは解決済みにしていました。
(後日興味で調べたりしてはいますが・・・)
そういう経緯があることだけ理解していただければうれしいです。

蛇足ながら付け加えます
やったこと
C#からVB.netのコードに変換
新規ファイルにクラスとして追加

Namespace conmenu
Public Class DefaultContexMenu
Inherits ContextMenu
Private t As TextBoxBase


Public Sub New(ByVal TextBox As DataGridTextBox)
Me.t = TextBox
Dim mi As New MenuItem("&Undo")
AddHandler mi.Click, AddressOf OnUndo
Me.MenuItems.Add(mi)
Me.MenuItems.Add("-")
mi = New MenuItem("Cu&t")
AddHandler mi.Click, AddressOf OnCut
Me.MenuItems.Add(mi)
mi = New MenuItem("&Copy")
AddHandler mi.Click, AddressOf OnCopy
Me.MenuItems.Add(mi)
mi = New MenuItem("&Paste")
AddHandler mi.Click, AddressOf OnPaste
Me.MenuItems.Add(mi)
mi = New MenuItem("&Delete")
AddHandler mi.Click, AddressOf OnDelete
Me.MenuItems.Add(mi)
Me.MenuItems.Add("-")
mi = New MenuItem("Select &All")
AddHandler mi.Click, AddressOf OnSelect
Me.MenuItems.Add(mi)
End Sub 'New
Protected Overrides Sub OnPopup(ByVal e As EventArgs)
MyBase.OnPopup(e)
End Sub 'OnPopup
'Handle Here the Enabled Disabled Items.
Sub OnSelect(ByVal sender As Object, ByVal e As EventArgs)
t.SelectAll()
End Sub 'OnSelect
Sub OnDelete(ByVal sender As Object, ByVal e As EventArgs)
t.Clear()
End Sub 'OnDelete
Sub OnPaste(ByVal sender As Object, ByVal e As EventArgs)
t.Paste()
End Sub 'OnPaste
Sub OnCopy(ByVal sender As Object, ByVal e As EventArgs)
t.Copy()
End Sub 'OnCopy
Sub OnCut(ByVal sender As Object, ByVal e As EventArgs)
t.Cut()
End Sub 'OnCut
Sub OnUndo(ByVal sender As Object, ByVal e As EventArgs)
t.Undo()
End Sub 'OnUndo
End Class 'DefaultContexMenu
End Namespace

trapemiya様のリンク先のコードを変換して使おうとしたのですが、
TextBoxBaseはDataGridでは使えないと言われ、TextBoxBaseの部分をDataGridやDataGridTextBoxに変更したのですが使えませんでした。
>今回の件は結局自力では解決できなかったので、情報のフィードバックが
>出来ませんでした。
>仕事でやっているので仕様変更後はそれを置いてでも作業をしなくてはいけないのに、
>ほかの人を放っておいて良いのか?と思い、今までは解決済みにしていました。
>(後日興味で調べたりしてはいますが・・・)
>そういう経緯があることだけ理解していただければうれしいです。

仕方なくフィードバックが遅れてしまうということは結構ですが、それが明らかであれば、その旨を明記していただけると、助かります。あおぞらさんの前回の投稿は、フィードバックを放棄したとしか読み取れませんでしたので、注意させていただきました。

>trapemiya様のリンク先のコードを変換して使おうとしたのですが、
>TextBoxBaseはDataGridでは使えないと言われ、TextBoxBaseの部分をDataGridや>DataGridTextBoxに変更したのですが使えませんでした。

試してみましたが、全く問題ないようでした。このクラスをどのように使いましたか?
管理人様
いつもお世話になっております。

> 試してみましたが、全く問題ないようでした。このクラスをどのように使いましたか?

ContextMenu.MenuItems.Addで作ったクラスを追加しようとしたのですが、
何をやってもメンバではありませんと言われたり非参照メンバのにはオブジェクト参照が必要と言われます。
管理人様が問題なく使えたと言うことはたぶん自分の使い方が間違っていると
言うことですね。
時間を作ってもっと勉強します・・・
DataGridTextBoxColumnのTextBoxを指定してDefaultContexMenuクラスのインスタンスを作成し、これをDataGridTextBoxColumnのTextBoxのContextMenuプロパティに設定すれば、とりあえずは使えます。

DOBON.NET | プログラミング道 | プログラミング掲示板