プロが教える店舗&オフィスのセキュリティ対策術

初投稿です。お世話になります。
現在、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#の知識なんてほとんどないのに、前任者が作ったもののメンテナンスを時々やっています))

すみません、長くなりました。
キャストなど、わかっていないのは重々承知しているのですが、ご助言・ご教授のほど、よろしくお願いいたします。

A 回答 (1件)

C#だと、そのままでもReflectionを使えば出来てしまうのですが、キャストについて理解できていないのにそれをやるのはかなり無理があるように思われるので、要件を満たすことだけ考えて、ロジックを組みなおす方が良いと思います。


通常その要件を満たすためには、ボタンの方も配列化して、インデックス毎に機能とボタン名をセットにして割り当てる方法をとると思いますけど、その方が難しいですか?
そっちの方がサンプルがあちこちに転がってると思いますけど。

この回答への補足

早速のご回答ありがとうございます。

Reflectionというのは初耳でした。現在いろいろ調べてみていますが、正直よくわからず…という感じです。
というより、見てみてもなんだか求めているものと違うような気がしているのはきっと調べ方が足りないのでしょうが…。
また、「ボタンを配列化して…」と書いてくださっていますが、いまいちイメージがつかめずにいます。
配列で持つというのはプログラム内?DBのデータの中??iniっぽいテキスト???(@_@;;
つくづくド素人ですみません。

さらに言えば今回、ボタン名(WebControlsのオブジェクト名)ではなくもうちょっとわかりやすくコード化して、私がいなくてもメンテナンスがしやすくなることも目標にしていたりします。
とはいっても、これはあくまでも二次的な目標なので、優先度は高くないのですが。

はっきりいって、もともとのつくりがやっつけというか、独断で突っ走った感のあるもので、それをうっかり引き継いでしまってあっぷあっぷしている…という状態なのです(涙)。
いまさらながら何でどっかの会社に作らせなかったのか、内部で何とかしようとしちゃったのか…という感じで…(うちは別にソフト会社でも何でもないので)。…はぁ…。というのは愚痴ですが。

もちろん、私自身もいろいろ調べたりしてみますが、もうちょっとヒントを…いただけると非常に助かります(すでに十分ヒントをいただいているのかもしれませんが)。
よろしくお願いします。

補足日時:2007/08/06 14:31
    • good
    • 0
この回答へのお礼

あのあとさらに調べまして、Reflectionを使ってコントロールを探すサンプルを見つけることができました(FindControlByFieldNameというメソッドを作るもの)。
そのサイトにあるサンプルどおりだとうまく動かなかったのですが(GetFieldでSystem.Reflection.BindingFlags.DeclaredOnlyを指定するとボタンを拾えなかった)、ちょっと修正したら思い通りに実行されました。

「Reflection」というキーワードを知らなければいつまでも解決できなかったと思います。ありがとうございました。

お礼日時:2007/08/10 14:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!