質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

3034閲覧

DefaultValueAttributeが効かない

toyotaku

総合スコア103

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2020/08/21 10:39

前提・実現したいこと

C#にて、Windows Formアプリケーションの開発を行っています。
基底となるフォームを作成し、そのフォームを継承する形で
複数のフォームの開発を行おうとしています。
基底のフォームにbool型のプロパティをデフォルト値をtrueにして
継承する各種フォームで必要に応じてtrue/falseを
フォームデザイナ上で指定したいと考えています。

実際には、基底フォーム上にコントロールが置かれており、
visibleのtrue/falseを継承するフォーム側で指定したいです。
基本的には表示する項目であり、例外的に非表示にすることがあるので
既定値をtrueにしたいです。
継承する側のコンストラクタで指定してもよいのですが、
なぜこの方法でできないのかわからないので質問させて頂いています。

発生している問題・エラーメッセージ

基底フォームクラス(From1)にてbool型のプロパティ(hoge)を作成し、
BrowsableAttributeをtrueに、
DefaultValueAttributeをtrueに指定しました。
そして、基底フォームを継承するフォーム(Form2)を作成しました。

Form2のbool型プロパティの既定値はtrueであるような振る舞いをしてほしいのですが、
falseであるかのような振る舞いをしてしまいます。
具体的には、Form2のプロパティウィンドウでリセットを行うと、
falseになってしまいます。また、trueの時に強調表示されます。
DefaultValueAttributeの使い方が間違っているのでしょうか?
bool型のプロパティの既定値をtrueにしたいです。

該当のソースコード

C#

1using System.ComponentModel; 2using System.Windows.Forms; 3namespace WindowsFormsApplication1 4{ 5 public partial class Form1 : Form 6 { 7 public Form1() 8 { 9 InitializeComponent(); 10 } 11 12 [Browsable(true)] 13 [DefaultValue(true)] 14 public bool hoge { get; set; } 15 16 } 17} 18

C#

1namespace WindowsFormsApplication1 2{ 3 public partial class Form2 : WindowsFormsApplication1.Form1 4 { 5 public Form2() 6 { 7 InitializeComponent(); 8 } 9 } 10}

Form2のプロパティウィンドウ

補足情報(FW/ツールのバージョンなど)

Visual Studio 2013
.Net Framework 3.5 SP1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

DefaultValueAttributeの使い方が間違っているのでしょうか?

そうですね。プロパティはフィールドの値を使用するようにし、そのフィールドの値に初期値をセットする必要があるようです。リファレンスには以下の記述があります。

DefaultValueAttribute クラス - Microsoft Docs

注意

DefaultValueAttribute によって、メンバーが属性の値で自動的に初期化されることはありません。 コードの初期値を設定する必要があります。

ですので、具体的には以下のようにコーディングする必要があるでしょうか。

C#

1 private bool hoge_ = true; 2 3 [Browsable(true)] 4 [DefaultValue(true)] 5 public bool hoge 6 { 7 get { return hoge_; } 8 set { hoge_ = value; } 9 }

ついでに書くと、(直接問題がある訳ではないですが)プロパティ名はHogeとのように先頭大文字のPASCALケースで定義した方がC#のコーディング標準に沿っています。

投稿2020/08/21 11:12

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/08/21 11:25

シリアライズや Designer.cs のサイズを小さくするために使われる属性ですが、いまいち何のためにあるのかわかりにくいですよね。 以下のような罠もあります。つけなくていい属性だと思います。 https://blog.karamem0.jp/entry/2012/04/01/000000
dodox86

2020/08/21 11:30

Zuishinさん、フォローの情報どうもありがとうございます。私はこの属性は初見でしたので参考になりました。
toyotaku

2020/08/21 12:35

dodox86様、回答ありがとうございます。 ご指摘の通り、修正したところ期待した通りの動作になりました。 回答して頂いた内容を見た後では、「そりゃそうだ」という感じでした・・・。 DefaultValueの設定と実際の動作が一致していないからおかしくなっていたのですね。 ご提示頂いていたリンクの内容も読んでいたのに、お恥ずかしい限りです。 Zuishin様、コメントありがとうございます。 リンクを参照させていただきましたが、こちらも私と同じく 属性と実装が一致していないせいでおかしな動きになってしまっているように見受けられます。 気をつけて利用しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問