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

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

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

変数を利用したプロパティの変更

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

■84698 / inTopicNo.1)  変数を利用したプロパティの変更
  
□投稿者/ カメ (1回)-(2017/07/27(Thu) 23:35:34)

分類:[C#] 

C#のフォームアプリケーション作成時に、
---------------
string str = "変更したいtextBox等のName";
this.Controls[str].Enabled = false;
---------------
というように入力して、
プロパティを指定したいのですが、
---------------
nullreferenceexceptionはハンドルされませんでした。
追加情報:オブジェクト参照がオブジェクト インスタンスに設定されていません。
---------------
と表示され、動作しません。
「this.変更したいtextBox等のName.Enabled = false;」であれば、
指定ができるようなのですが。

お手数をおかけしますが、
ご指導をお願いいたします。

引用返信 編集キー/
■84699 / inTopicNo.2)  Re[1]: 変数を利用したプロパティの変更
□投稿者/ shu (1041回)-(2017/07/28(Fri) 07:07:10)
No84698 (カメ さん) に返信

> this.Controls[str].Enabled = false;
> ---------------
> というように入力して、
> プロパティを指定したいのですが、
> ---------------
> nullreferenceexceptionはハンドルされませんでした。
> 追加情報:オブジェクト参照がオブジェクト インスタンスに設定されていません。
> ---------------
> と表示され、動作しません。
Controlsの指定はこの場合、thisに対し直接貼り付けてあるコントロールしか
対象となりません。Panelなどの上にある場合は、panel.Controlsのように直属の
親コントロールを指定する必要があります。




引用返信 編集キー/
■84700 / inTopicNo.3)  Re[1]: 変数を利用したプロパティの変更
□投稿者/ Azulean (842回)-(2017/07/28(Fri) 07:07:38)
2017/07/28(Fri) 07:15:07 編集(投稿者)
No84698 (カメ さん) に返信
> ---------------
> string str = "変更したいtextBox等のName";
> this.Controls[str].Enabled = false;
> ---------------

このコードの場合、this(=Form) 直下にあれば取得できると思います。
例えば、TabControl や GroupBox、Panel の上に配置されている場合は、this 直下ではないため、取得できません。

----

すべての Control の配下も走査的に調べるよりは、自分で Dictionary でも作った方がマシかもしれませんね。
リフレクションでフィールドをあらかじめ探しておくとか。


private readonly Dictionary<string, Control> _cachedControls;
public Form1()
{
    InitializeComponent();

    var fields = GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
    _cachedControls = fields.Where(field => field.FieldType.IsSubclassOf(typeof(Control)))
        .ToDictionary(field => field.Name, field => (Control)field.GetValue(this));
}

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        _cachedControls[textBox3.Text].Enabled = false;
    }
    catch (Exception exception)
    {
        MessageBox.Show(exception.Message);
    }
}

引用返信 編集キー/
■84701 / inTopicNo.4)  Re[1]: 変数を利用したプロパティの変更
□投稿者/ 魔界の仮面弁士 (1361回)-(2017/07/28(Fri) 08:56:07)
No84698 (カメ さん) に返信
> string str = "変更したいtextBox等のName";
> this.Controls[str].Enabled = false;

恐らくは
 this.Controls.Find(str, true)[0].Enabled = false;
でいけると思いますが、繰り返しアクセスするのであれば、
再利用しやすいよう、起動時に Dictionary<,> 等に
蓄えておくことをお奨めします。
引用返信 編集キー/
■84798 / inTopicNo.5)  Re[2]: 変数を利用したプロパティの変更
□投稿者/ カメ (3回)-(2017/08/02(Wed) 22:48:56)
遅レスになり申し訳ありません。
皆さん解凍していただきありがとうございました。
おかげで解決することができました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ