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

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

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

Re[4]: 複数コントロールのメソッド処理


(過去ログ 37 を表示中)

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

■19029 / inTopicNo.1)  複数コントロールのメソッド処理
  
□投稿者/ tanaka (75回)-(2008/05/19(Mon) 13:39:13)

分類:[C#] 

以前こちらで複数のコントロールのプロパティを設定させるメソッドの作成を教えていただきましたが
今度は複数のコントロールのメソッドを設定させるメソッドの作成を教えていただきたいのですが

引数は
・コントロール名
・メソッド名
・メソッドの引数

引用返信 編集キー/
■19039 / inTopicNo.2)  Re[1]: 複数コントロールのメソッド処理
□投稿者/ Algol (7回)-(2008/05/19(Mon) 14:50:57)
2008/05/19(Mon) 15:34:48 編集(投稿者)

No19029 (tanaka さん) に返信

#タイプミス訂正…

今まで発言を眺めてましたが、どうも調べる努力が見受けられない気がします。
調べる努力を怠ると、かなり重要なスキルが身につきませんぞ?
がんばって脳みそのシワを増やしましょう。

ここに何らかのヒントがあります。
まずはここをブックマークして調べる努力をする事から始めませんか?
http://msdn.microsoft.com/ja-jp/library/default.aspx

まぁ、おせっかいな書き込みだけでは意味ないのでヒントだけ。
http://msdn.microsoft.com/ja-jp/library/system.type_members.aspx


引用返信 編集キー/
■19053 / inTopicNo.3)  Re[1]: 複数コントロールのメソッド処理
□投稿者/ Jitta on the way (92回)-(2008/05/19(Mon) 19:08:39)
No19029 (tanaka さん) に返信
> 以前こちらで複数のコントロールのプロパティを設定させるメソッドの作成を教えていただきましたが
> 今度は複数のコントロールのメソッドを設定させるメソッドの作成を教えていただきたいのですが
>
> 引数は
> ・コントロール名
> ・メソッド名
> ・メソッドの引数
>

メソッドを設定させる、って、何をするの?デリゲートを設定する?



それはともかく。
止めたほうがいいと思います。素直にインターフェースを定義するのがいいと思います。
引用返信 編集キー/
■19069 / inTopicNo.4)  Re[2]: 複数コントロールのメソッド処理
□投稿者/ tanaka (77回)-(2008/05/20(Tue) 08:36:04)
No19053 (Jitta on the way さん) に返信
> ■No19029 (tanaka さん) に返信
>>以前こちらで複数のコントロールのプロパティを設定させるメソッドの作成を教えていただきましたが
>>今度は複数のコントロールのメソッドを設定させるメソッドの作成を教えていただきたいのですが
>>
>>引数は
>>・コントロール名
>>・メソッド名
>>・メソッドの引数
>>
>
> メソッドを設定させる、って、何をするの?デリゲートを設定する?
>
>
>
> それはともかく。
> 止めたほうがいいと思います。素直にインターフェースを定義するのがいいと思います。
いろいろ試してみましたがご指摘の通りの方法でいきたいと思います。
解決済み
引用返信 編集キー/
■19074 / inTopicNo.5)  Re[3]: 複数コントロールのメソッド処理
□投稿者/ επιστημη (1029回)-(2008/05/20(Tue) 10:12:09)
επιστημη さんの Web サイト
# 余計なお世話ではありますが

>>止めたほうがいいと思います。素直にインターフェースを定義するのがいいと思います。
> いろいろ試してみましたがご指摘の通りの方法でいきたいと思います。

どうやるのか、わかってます?

解決済み
引用返信 編集キー/
■19082 / inTopicNo.6)  Re[3]: 複数コントロールのメソッド処理
□投稿者/ Algol (8回)-(2008/05/20(Tue) 10:36:14)
No19069 (tanaka さん) に返信
> ■No19053 (Jitta on the way さん) に返信
>>■No19029 (tanaka さん) に返信

>>
>>それはともかく。
>>止めたほうがいいと思います。素直にインターフェースを定義するのがいいと思います。
> いろいろ試してみましたがご指摘の通りの方法でいきたいと思います。

え?コントロールに対してインターフェイスを??
出来なくはないですが、それをやると茨の道になる気がしますが…

本人がこれで解決したのなら良いのですが。
解決済み
引用返信 編集キー/
■19104 / inTopicNo.7)  Re[4]: 複数コントロールのメソッド処理
□投稿者/ Algol (9回)-(2008/05/20(Tue) 12:17:24)
2008/05/20(Tue) 13:05:19 編集(投稿者)
2008/05/20(Tue) 12:56:17 編集(投稿者)
2008/05/20(Tue) 12:54:01 編集(投稿者)
2008/05/20(Tue) 12:20:03 編集(投稿者)

基本的にイヂワルなのでコアな部分を穴埋め問題形式で…ぉぃ

ちなみに、穴を埋めただけでは使えないようにしてあります。
いくつかのクラスも作らなくてはいけませんし、用法をきちんと理解しないと使え(ないはず)ません。

どう使うかは、スレ主さん次第って事で…

あ、環境ですが
VS2008Pro C# 
の
Windowsフォーム
で確認してあります。

/// <summary>
/// コントロールのメソッドを実行
/// </summary>
/// <param name="baseControl">ベースのコントロール</param>
/// <param name="targetControlName">ターゲットのコントロール</param>
/// <param name="targetMethodName">ターゲットのメソッド</param>
/// <param name="methodBindingFlags">メソッドの種類</param>
/// <param name="parameters">パラメータ(必要ないときはNull)</param>
/// <returns>戻り値(voidはNullが返る)</returns>
internal static object ExecMethod(Control baseControl, string targetControlName, string targetMethodName, BindingFlags methodBindingFlags, params object[] parameters)
{
    //番兵
    if (baseControl == null) throw new ArgumentNullException("baseControl");
    if (targetControlName == null) throw new ArgumentNullException("targetControlName");
    if (targetMethodName == null) throw new ArgumentNullException("targetMethodName");

    //コントロールのインデックス
    int controlIndex = baseControl.Controls.IndexOfKey(targetControlName);
    //なかったらエラー
    if (controlIndex < 0) throw new NonControlException(targetControlName);

    //メソッドインフォの取得
    Type controlType = ■1■;
    MethodInfo[] methodsInfo = ■2■;
    //なかったらエラー
    if (methodsInfo == null || (methodsInfo != null && methodsInfo.Length <= 0))
        throw new NonMethodException(targetMethodName);

    //パラメータの確認
    MethodInfo method = null;
    int parametersCount = parameters == null ? 0 : parameters.Count();
    foreach(MethodInfo methodInfo in methodsInfo.Where(item=>item.Name.Equals(targetMethodName, StringComparison.CurrentCultureIgnoreCase)))
    {
        //パラメータインフォの取得
        ParameterInfo[] paramsInfo = ■3■;
        //パラメータ数の確認
        if (paramsInfo.Count() != parametersCount) continue;
        // 0コ だったら設定してループ終了
        if(parametersCount == 0) 
        {
            method = methodInfo;
            break;
        }
        //パラメータの種類を確認
        for(int paramIndex = 0; paramIndex < parametersCount; paramIndex++)
        {
            if (■4■ != parameters[paramIndex].GetType()) 
                continue;
        }
        //あってたら設定してループ終了
        method = methodInfo;
        break;
    }

    //取得できなかったらエラー
    if(method == null)
        throw new NonMethodException(targetMethodName);

    //メソッドの実行
    return ■5■;
}

ex1)
string getToString = (string)xxx.ExecMethod(this, "textBox1", "ToString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null);

ex2)
xxx.ExecMethod(this, "textBox1", "AppendText", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, "ふぉふぉふぉ");

#バグ潰しのため修正…(汗
#baseControl引数の入力確認を忘れたです…

#修正したらインデントが…(泣
#必要なのまで削除しちゃうし…(汗

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -