初投稿です。お世話になります。
現在、VisualStadio 2003でC#を使ってWebアプリケーションの開発(正確に言えば小手先の修正)をしています。そこで壁にぶち当たってしまいましたので、助けていただければと思い投稿します。
システムにログインすると表示されるメニュー画面があり、今まではログイン者の部署ごとにプログラムに直書きでボタンの押下可/不可の制御をしていました。
今回、それに加えて個別に利用するボタンをDBのテーブルに設定して、データがある人がログインしたときに登録されているボタンのみ押下可にしたいと思っています。
そこで…
-------------------------------------------------------
private bool InvidualSetting(int userno, Page page)
{
const string COMMAND = "SELECT A.ボタン名 FROM MST_メニュー A "
+ "WHERE EXISTS (SELECT 'X' FROM MST_個別メニュー B WHERE )"
+ "B.ユーザNO = %USERNO% AND A.メニュー番号 = B.メニュー番号)"
DataTable invidualTable = %USERNO%を渡されたusernoに置換してSQL実行
(ここで取得するボタン名とは、System.Web.UI.WebControls.Button で宣言されているボタンの名前)
データがなければfalseを返して終了
データがあった場合…
Button invidualButton;
foreach(DataRow row in invidualTable.Rows)
{
invidualButton = (Button)row[0];
invidualButton.Enabled = true;
}
return true;
}
呼び出し元では、
trueが帰ってきたら処理終了
falseが帰ってきたら部署ごとの制御を行なう
-------------------------------------------------------
上記のようにプログラムに追加したのですが、実行時に
invidualButton = (Button)row[0];の部分で
「指定されたキャストは有効ではありません」
とエラーになり、どうしていいかわからない状態です。
その前の、
invidualButton = (Button)row[0];
の部分で(Button)がないとビルド時に「Object型をWebCotrolsに暗黙的に変換できません」とエラーが出ます。
ならば明示的に変換できればいいんじゃないか??と思う次第なのですが…。やり方間違っているからエラーになるんでしょうけれど…。
JavaScriptでいうevalのようなもので値の評価というか、そういうことができないのかな…と調べてみたのですが、さっぱりでした。
確実なのは、今までと同じくプログラムに直書きしてしまうことだと思うのですが、それだと人が変わるなど変更があるたびにビルドしてリリースして…という作業が発生してしまうのでそれだけは避けたいと思っています。
(画面を新規に作るスキルはないので結局はDBのデータを更新するしかないのですが(C#の知識なんてほとんどないのに、前任者が作ったもののメンテナンスを時々やっています))
すみません、長くなりました。
キャストなど、わかっていないのは重々承知しているのですが、ご助言・ご教授のほど、よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
C#だと、そのままでもReflectionを使えば出来てしまうのですが、キャストについて理解できていないのにそれをやるのはかなり無理があるように思われるので、要件を満たすことだけ考えて、ロジックを組みなおす方が良いと思います。
通常その要件を満たすためには、ボタンの方も配列化して、インデックス毎に機能とボタン名をセットにして割り当てる方法をとると思いますけど、その方が難しいですか?
そっちの方がサンプルがあちこちに転がってると思いますけど。
この回答への補足
早速のご回答ありがとうございます。
Reflectionというのは初耳でした。現在いろいろ調べてみていますが、正直よくわからず…という感じです。
というより、見てみてもなんだか求めているものと違うような気がしているのはきっと調べ方が足りないのでしょうが…。
また、「ボタンを配列化して…」と書いてくださっていますが、いまいちイメージがつかめずにいます。
配列で持つというのはプログラム内?DBのデータの中??iniっぽいテキスト???(@_@;;
つくづくド素人ですみません。
さらに言えば今回、ボタン名(WebControlsのオブジェクト名)ではなくもうちょっとわかりやすくコード化して、私がいなくてもメンテナンスがしやすくなることも目標にしていたりします。
とはいっても、これはあくまでも二次的な目標なので、優先度は高くないのですが。
はっきりいって、もともとのつくりがやっつけというか、独断で突っ走った感のあるもので、それをうっかり引き継いでしまってあっぷあっぷしている…という状態なのです(涙)。
いまさらながら何でどっかの会社に作らせなかったのか、内部で何とかしようとしちゃったのか…という感じで…(うちは別にソフト会社でも何でもないので)。…はぁ…。というのは愚痴ですが。
もちろん、私自身もいろいろ調べたりしてみますが、もうちょっとヒントを…いただけると非常に助かります(すでに十分ヒントをいただいているのかもしれませんが)。
よろしくお願いします。
あのあとさらに調べまして、Reflectionを使ってコントロールを探すサンプルを見つけることができました(FindControlByFieldNameというメソッドを作るもの)。
そのサイトにあるサンプルどおりだとうまく動かなかったのですが(GetFieldでSystem.Reflection.BindingFlags.DeclaredOnlyを指定するとボタンを拾えなかった)、ちょっと修正したら思い通りに実行されました。
「Reflection」というキーワードを知らなければいつまでも解決できなかったと思います。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- プリンタ・スキャナー キャノンmp490プリンター【エラー番号5400】で【プリンタートラブルが発生しました。電源を入れ直 2 2023/07/24 17:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c# 文字列の最後から1文字削除...
-
DataGridViewのチェックボック...
-
Webブラウザの閉じるボタン無効...
-
Page_Load時にボタンクリックイ...
-
Eclipseでクリーンが出来ない
-
Excel:「フォーム」のボタンで...
-
メール添付されたPDFファイルが...
-
エクセルにカウンターを設置したい
-
Fancyboxのiframe内に閉じるボタン
-
JDialogの×(閉じる)ボタン
-
CheckBoxをボタン形式にして押...
-
初期状態に戻す方法
-
VC++ MFC CListCtrlで、ボタン...
-
ASP.NETのGridViewでNULLの場合...
-
ACCESS リストボックスに検索結...
-
最大化ボタンと最小化ボタンを...
-
VBAで一時中断したプログラムの...
-
ブラウザの×ボタン判定
-
ブラウザの×ボタン(閉じるボタ...
-
ロストフォーカスイベントとそ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DataGridViewのチェックボック...
-
グリッドビューでのチェックボ...
-
ブラウザの×ボタン(閉じるボタ...
-
【JavaScript?HTML?】Webペー...
-
Eclipseでクリーンが出来ない
-
c# 文字列の最後から1文字削除...
-
VBAで一時中断したプログラムの...
-
【C#】 : WindowsProgramming ...
-
EXCEL2010でセルが編集中かを判...
-
Ctrlキーを押しながらのダブル...
-
SPREADでカーソルの位置を1行目...
-
メール添付されたPDFファイルが...
-
ロストフォーカスイベントとそ...
-
asp.net メッセージボックス表...
-
CheckBoxをボタン形式にして押...
-
JSPでメッセージボックスを表示...
-
今更、VBAでRPA、キーボード操...
-
VC++ MFC CListCtrlで、ボタン...
-
Fancyboxのiframe内に閉じるボタン
-
VBのこのコードの意味を教えて...
おすすめ情報