ASP.Net MenuItemDataBoundでメニュー項目の表示・非表示を制御する方法について

このQ&Aのポイント
  • ASP.NetのMenuItemDataBoundを使用して、メニュー項目の表示・非表示を制御する方法についてご教授いただけませんか。
  • ロールの種別によってメニューに表示される項目を制御したいですが、うまくいきません。
  • 現在、新規という項目があり、Observerというロールの場合は非表示にしたいですが、正しく動作しません。
回答を見る
  • ベストアンサー

ASP.Net MenuItemDataBound

大変お世話になっております。 ロールの種類でメニューにある項目の表示・非表示を行いたいのですが、なかなかうまくいきません。 下記のように記述したのですが、どこが間違っているのか、もしくは考え方自体が間違っているのかも含め、何かご指摘などございましたら、是非ご教授いただければ幸いでございます。 何卒よろしくお願い申し上げます。 Protected Sub NavigationMenu_MenuItemDataBound(sender As Object, e As MenuEventArgs) Handles NavigationMenu.MenuItemDataBound     If e.Item.Text = "新規" Then       If Page.User.IsInRole("Observer") Then         e.Item.Enabled = False       End If     End If End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • onos
  • ベストアンサー率81% (127/155)
回答No.2

まずはブレイクポイントを指定したのにデバッグ実行でひっかからない、というところを 解決するのがよさそうです。 この手のコントロールだと、ポストバック時はもともとコントロールが保持していた値をもとに 表示する値を作成するようになっていて、データのバインディングが発生しないことがあります。 最初この状態かな、と思ったのですが、デバッグを開始したとき(一番最初)もブレイクポイントで 止まらないんですよね? あと考えられることは、メニューコントロールに表示する項目をどう作っているか、というあたり ですかね。 http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.menu.aspx ここに記述のある「静的データ」の形式、つまりMenuItemを使っているようなときは、そもそも データのバインディングを行っていないのでMenuItemDataBoundというイベントが発生しないんじゃ ないかと思います。

kyokotan12
質問者

お礼

onosさん 大変お世話になっております。 なるほど、静的データだとイベントが発生しない! メニューの編集は、メニュー編集の編集というメニュー項目エディターで行っておりますので、onosさんのおっしゃる通り、静的データに該当するのでしょうね! イベントが発生しないのでは、どうにもなりませんね! 大変勉強になりました。 考え方を変えて、MenuItemClickイベントで解決策を練ろうとかと思っております。また壁に当たりましたら、何卒ご教授いただければと存じます。 ありがとうございました。

その他の回答 (1)

  • onos
  • ベストアンサー率81% (127/155)
回答No.1

このようにプログラムを記述したことで ・どのような結果となっているのか ・期待していた結果はどのようなものなのか といった内容が記述されないことには、あなたの手元で何がおきているのか誰も推測できないかと。 あと、どういったことを調べていて、どこまでのことがわかっているか。 たとえばブレークポイントでとめて1行ずつ動作させて、実際のデータの内容と 動きをどこまで追いかけているか、等の情報もきちんと記述してください。

kyokotan12
質問者

補足

onosさん お世話になっております。 説明不足で大変申し訳ございません。 まず、MenuItemDataBound でYahooで検索して http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.menu.menuitemdatabound.aspx こちらのサイトを発見して、メニューのデータをバインドするイベントの記述の仕方を探しました。 MenuEventArgs にて、カスタム コンテンツを追加したり、メニュー項目を表示する前に変更するなど出来るとの記述があったので、プロパティを調べてみると、Enabled があったので、そこに False を設定しました。 さっそく実行してみたのですが、メニューから指定項目が消えていなかったので、一番初めの IF のところにブレイクポイントを設定して、デバックしてみたのですが、デバックに引っかかりません。 これは、わたくしが記述した内容自体が間違いかもしれないので、新たに、MenuItemDataBound で他の記事を検索したのですが、メニューを編集しているようなサイト記事がなかったので、こちらにて質問させていただきました。 (1)そもそもメニューを編集するのは このイベントでよいのか? (2)ブレイクポイントを設定したのになぜ、デバックに引っかからないのか? (3)わたくしが認識しているこのイベント自体、まったく間違いなのかどうか? (4)メニューを編集するには他の方法があるのか? おおよそ上記4つが知りたいと思っております。 何卒よろしくお願い申し上げます。

関連するQ&A

  • ASP Pageの孫継承のPage_Load

    VisualStudio2010/.NET4.0で開発しています。 やりたい事  ・以下のVBのC#版を作りたい。   継承元のPage_Loadを実行させたい Public Class Base  Inherits System.Web.UI.Page   Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load    Response.Write("親Page_Load")   End Sub End Class Public Class _Default  Inherits Base   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load    Response.Write("子Page_Load")   End Sub End Class 上記のaspは実行すると画面上に「親Page_Load子Page_Load」と表示される。 だが、以下のプログラムでは「子Page」としか表示されないので困っております。 public class Base : System.Web.UI.Page {  private void Page_Load(object sender, EventArgs e)  {   Response.Write("親Page");  } } public partial class _Default : Base {  protected void Page_Load(object sender, EventArgs e)  {   Response.Write("子Page");  } } よろしくお願いいたします。

  • Page_Load時にボタンクリックイベントを実行するには?

    ASP.NETでPage_Load時にボタンクリックイベントを実行するにはどのようにすればいいのでしょうか? 具体的には、HTTPクエリ文字列のresultが"1"の場合はbutton1_Clickイベントを実行したいのですが、やりかたが分かりません。 サンプルソースの★の部分に button1_Click(sender, System.Web.UI.ImageClickEventArgs.Empty) と入れたら、 「型 'System.EventArgs' のオブジェクトを型 'System.Web.UI.ImageClickEventArgs' にキャストできません。」 というエラーメッセージが表示されてしまいます。 ■■■■■■サンプルソース■■■■■■ Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load   'クエリー取得(数値チェック)   If Request.QueryString("result").ToString = "1" Then     '検索ボタン押下処理を表示する     ★button1_Clickイベントを実行したい。   End If End Sub '検索ボタン押下 Protected Sub button1_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles button1.Click '検索結果を表示する     : End Sub

  • dropdownlistのvalue値の取得方法について

    VS2005 WinXP pro 下のようにページ表示時にDropDownListに年を入れています。 しかし、DropDownListを何に変更してもSelectedIndexした 値が取れてしまい困っています (今なら常に2008が取れてしまう) 本当なら2009を選択したときは下の関数で 2009と表示したいのです。 お力添えお願いいたします。 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load '-------------------------------------------------------------------------------------- ' 年をコンボボックスに追加 '-------------------------------------------------------------------------------------- Dim sNum As Integer = 0 Dim y As Integer For y = 2007 To Year(Now) + 3 cmbYear.Items.Add(New ListItem(y, y)) If y = Year(Now) Then cmbYear.SelectedIndex = sNum ←ここを消すと正しく動く End If sNum += 1 Next End Sub Protected Sub btnEdit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEdit.Click '-------------------------------------------------------------------------------------- ' 選択項目の取得 '-------------------------------------------------------------------------------------- MsgBox(cmbYear.Items.Item(cmbYear.SelectedIndex).Value) 2008 MsgBox(cmbYear.SelectedValue) ←2008 どちらも2008 End Sub 以上、よろしくお願い致します。

  • 2つのチェックボックスを制御

    2つのチェックボックスがあり両方ともはずせて片方だけにチェックがつく2つの チェックボックスが作りたいです 自分なりに作成してみました。このソースで不具合等ありませんでしょうか Private Sub ckb1_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ckb1.CheckedChanged If ckb1.Checked = True Then ckb2.Checked = False End If End Sub Private Sub ckb2_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ckb2.CheckedChanged If ckb2.Checked = True Then ckb1.Checked = False End If End Sub 新人プログラマーなので自信がありません

  • VB2008でPictureBoxをキーボードを使って動かしたい

    VBを始めたばかりの初心者です。 VB2008を使ってPictureBoxに取り込んだイラストをキーボードを使って自由に動かしたいと思っています。 今作ったものの問題点 1.現状、全く同時に→と↑のキーを押せば右上に動きます。  また、→キーを押してイラストが右に動いているときに、↑キーを押すと上に動きます。  これを右上に動くようにする方法が知りたいのです。 2.キーを押し続けてイラストを動かし続けようとすると、一回動いて止まってから動き続けるという風になってしまいます。  これを止まらずに動くようにしたいのです。 ちなみにこれ↓が今のソースコードです。 Public Class Form1 Private Sub form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Up Then PictureBox1.Top = PictureBox1.Top - 10 End If End Sub Private Sub form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Down Then PictureBox1.Top = PictureBox1.Top + 10 End If End Sub Private Sub form1_KeyLeft(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Left Then PictureBox1.Left = PictureBox1.Left - 10 End If End Sub Private Sub form1_KeyRight(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Right Then PictureBox1.Left = PictureBox1.Left + 10 End If End Sub End Class これ↑を実行する場合は、デザインにPictureBoxを表示してください。PictureBoxに入れるイラストは適当なものを入れてください。 よろしくお願いします。

  • イベント内で別イベントを呼ぶ方法

    早速質問させていただきます。 Form上にDataGridView(dgv)があります。 dgvのセルをマウスでダブルクリックした時に処理を入れております。 Private Sub dgv_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellDoubleClick   If e.RowIndex = -1 Then     Exit Sub   End If   '//処理 End Sub このdgv上でEnterキーを押した際に、ダブルクリックしたのと同じ処理を 行いたいのですが、このような場合、どのような実装をするのが一般的なのでしょうか? 例えば、下記の様にCall dgv_CellDoubleClick(sender, e)をするとEventArgsが合わないためエラーになってしまいます。 適切な方法をご教授お願い致します。 Private Sub dgv_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dgv.KeyDown   If e.KeyCode = Keys.Enter Then     Call dgv_CellDoubleClick(sender, e)   End If End Sub

  • クラスやモジュールで纏める方法ありますか?

    説明が非常にへたくそなので、プログラムをそのまま書きます・・・・ スイマセン Private Sub TextBox1_2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1_2.KeyPress If e.KeyChar = Chr(Keys.Enter) Then Me.SelectNextControl(sender, True, True, True, True) e.Handled = True End If End Sub Private Sub TextBox1_4_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1_4.KeyPress If (e.KeyChar < "0"c Or e.KeyChar > "9"c) And e.KeyChar <> vbBack Then e.Handled = True End If If e.KeyChar = Chr(Keys.Enter) Then Me.SelectNextControl(sender, True, True, True, True) e.Handled = True End If End Sub Private Sub TextBox1_5_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1_5.KeyPress If (e.KeyChar < "0"c Or e.KeyChar > "9"c) And e.KeyChar <> vbBack And e.KeyChar <> ","c Then e.Handled = True End If If e.KeyChar = Chr(Keys.Enter) Then Me.SelectNextControl(sender, True, True, True, True) e.Handled = True End If End Sub 上記のプログラム、TextBox○○○_5.KeyPressの○○○の部分が1から100まであるのですが、あまりにも行数が多くなって長くなるので、ほかのクラスやモジュールにまとめる方法ってありませんか? よろしくお願いしますm(__)m

  • VB2013でのプログラム作成でつまづきました

    初めまして ご質問です 会社にて、職場改善のため VB2013でプログラムを作成していますが PCに詳しいのが自分しかいなく、指名されました。。。 もちろん自作PCとか作れるぐらいですが プログラムなんてやったことないし困っています 職場にプログラム専門の方がいるので教育を受けていますが 2.3回教えてもらって  「windowsの電卓を作ろう」と言われました 電卓作成は、初心者用の題材らしいですが とりあえず教えてもらった事を駆使し まずは、テキストボックスとテキストボックスに数字を入れ その二つを +や-ボタンを押し =ボタンを押すと、3つ目のテキストボックスに表示させるという 簡単なプログラムは、なんとかできましたが windowsぽくすると 例 11 + 12 - 9 とテキストに表示され =ボタンを押すと 表示が消え 計算結果が表示されます いまの問題 ・整数と文字列を表示させ、計算だけさせる ・変数宣言、IF、Serectしか教わってない(それだけでできる言われた笑) ・まだ、いまいちわかっていないため 詳しく知りたい 無論、教えてもらったコードをそのまま使いたいわけじゃなく どーいう流れで、どーいう風にというのを理解したいです 結局は自分が理解して、少しずつやらないといけないので 詳しい方、教えてください。 現在なにもできてないコードです ここにどう埋めるか教えてほしいです ------------------------------------------------------------------------------ Option Explicit On Public Class Form Public oboe As String '押されたボタンが数値以外を覚える変数 Public befor As String '押されたボタンが数値の場合 覚える変数 Public anser As Integer ' 計算結果を保存する 変数 Public number As Integer '入力された数値を保存する 変数 Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '1 befor = "1" ans.Text &= "1" End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '2 befor = "2" ans.Text &= "2" End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click '3 befor = "3" ans.Text &= "3" End Sub Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click 'たし算 oboe = "+" ans.Text &= "+" number = befor + ans.Text End Sub Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click '掛け算 End Sub Private Sub Button4_Click_1(sender As Object, e As EventArgs) Handles Button4.Click '計算 End Sub Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click 'CLEAR End Sub Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click '引き算 End Sub Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click '割り算 End Sub Private Sub ans_TextChanged(sender As Object, e As EventArgs) Handles ans.TextChanged

  • PageクラスのDisposedイベントについて教えて

    PageクラスのDisposedイベントについて教えて下さい。 VS2005 VB.Net環境でwebサイトを作成し、Default.aspxに以下のコードを書きました。 Partial Class _Default Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Label1.Text = "Page_Load通過。" End Sub Protected Sub Page_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed Label1.Text = "Page_Disposed通過。" End Sub End Class 目的は、Page_DisposedメソッドのMe.Disposedイベントはいつ発生するのか知りたいのです。 MSDNライブラリでは、 『サーバー コントロールがメモリから解放されると発生します。 これは、ASP.NET ページが要求されている場合の サーバー コントロールの有効期間における最終段階です。』 とありますが、良くわかりません。。。 ご教授下さい、宜しくお願い致します。

  • 【プログラミング】ショートカットキーの設定について

    KeyPress イベントプロシージャの設定で Private Sub Button1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles Button1.KeyPress If e.KeyChar(Keys.F) Then End If End Sub この中にボタン1の命令をさせたいとき、どのように書けばいいんでしょうか? Visual Basic 2010です コードを教えてください、お願いします

専門家に質問してみよう