(能力向上) Visual Studio Communityでコード分析を実行する
分析ルールの設定方法
- 「プロジェクトのプロパティ」→「コード分析」にて設定する
実行と分析結果
- Alt+F11で実行 (「ビルド」→「ソリューションでコード分析を実行」のショートカット)
- コード分析ウィンドウに結果が表示される
- 試しに分析ルールを「Microsoftのすべての規則」にしてみると
たくさん出ます。
この指摘事項を減らすようにコーディングしていくと…、その内上達しているはずです。
体系的な学習はこちら
- 作者: ハーバート・シルト,エディフィストラーニング株式会社矢嶋聡
- 出版社/メーカー: 翔泳社
- 発売日: 2010/12/03
- メディア: 大型本
- 購入: 5人 クリック: 55回
- この商品を含むブログ (6件) を見る
(C#) ComboBoxのアイテムに表示名と値をあてる
コード
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ComboBoxDispalyValue { public partial class Form1 : Form { public class ItemSet{ // DisplayMemberとValueMemberにはプロパティで指定する仕組み public String ItemDisp { get; set; } public int ItemValue { get; set; } // プロパティをコンストラクタでセット public ItemSet(int v, String s){ ItemDisp = s; ItemValue = v; } } public Form1() { InitializeComponent(); // ComboBox用データ作成 //ListでOK //IList インターフェイスまたは IListSource インターフェイスを実装する、DataSet または Array などのオブジェクト。 List<ItemSet> src = new List<ItemSet>(); src.Add(new ItemSet(100, "Number1"));/// 1つでItem1つ分となる src.Add(new ItemSet(200, "Number2")); src.Add(new ItemSet(300, "Number3")); // ComboBoxに表示と値をセット comboBox1.DataSource = src; comboBox1.DisplayMember = "ItemDisp"; comboBox1.ValueMember = "ItemValue"; // 初期値セット comboBox1.SelectedIndex = 0; comboBox1_SelectedIndexChanged(null, null); } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { // labelに現在コンボ選択の内容を表示 ItemSet tmp = ((ItemSet)comboBox1.SelectedItem);//表示名はキャストして取りだす labelDisplay.Text = tmp.ItemDisp; labelValue.Text = comboBox1.SelectedValue.ToString();//値はそのまま取りだせる } } }
結果GUI
ComboBoxの選択に応じた、表示名と値が下部に表示される。
体系的に学習する場合はこちら
- 作者: ハーバート・シルト,エディフィストラーニング株式会社矢嶋聡
- 出版社/メーカー: 翔泳社
- 発売日: 2010/12/03
- メディア: 大型本
- 購入: 5人 クリック: 55回
- この商品を含むブログ (6件) を見る
その他
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Test_Enum
{
public enum EGains {G0, G1, G2, G3, G4, G5, G6, TL = 14}//enumの値をswitch文にも使いたい
public partial class Form1 : Form
{
private Dictionary<string, EGains> data;
public Form1()
{
InitializeComponent();
//ComboBoxのItem名とレジスタ値(enumの値)の紐付け
data = new Dictionary<string, EGains>();
data.Add("Gain0" , EGains.G0);
data.Add("Gain1" , EGains.G1);
data.Add("Gain2" , EGains.G2);
data.Add("Gain3" , EGains.G3);
data.Add("Gain4" , EGains.G4);
data.Add("Gain5" , EGains.G5);
data.Add("Gain6" , EGains.G6);
data.Add("THERMO_LEVEL" , EGains.TL);
// ComboBoxのItem名割り当て
string ss = new string[data.Count()];
int i = 0;
foreach (String k in data.Keys)
{
ss[i++] = k;
}
//string ss = new string[] { "Gain0", "Gain1", "Gain2", "Gain3", "Gain4", "Gain5", "Gain6", "THERMO_LEVEL" };
comboBox1.Items.AddRange(ss);
comboBox1.SelectedIndex = 0;//初期値は先頭
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//7選んだらレジスタに14が入るようにする
//ここはSelectIndex=0~7しか入りようがない
//numericUpDown1.Value = EGains.[comboBox1.SelectedIndex];
this.numericUpDown1.ValueChanged -= new System.EventHandler(this.numericUpDown1_ValueChanged);
numericUpDown1.Value = (int)data[comboBox1.SelectedItem.ToString()];//[理解]Dictionaryに値が無い時はエラーになる
label_nInterlock.Text = numericUpDown1.Value.ToString();
this.numericUpDown1.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged);
}
//レジスタ値代わり
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
//14選んだら7が入るようにする
//6~13選んだら7が入るようにする
this.comboBox1.SelectedIndexChanged -= new System.EventHandler(this.comboBox1_SelectedIndexChanged);
//[異常系対応]0未満なら0,14超過なら14 //0来なくない? //なので無ければサーモ固定で良いかな
String retKey = data.FirstOrDefault(x => (int)x.Value == numericUpDown1.Value).Key;//Linqで逆引き //dictionaryにキーが無い時は空が返る
//if (retKey == null)
//{
// //異常値はTHERMO_LEVEL。違和感有り。おかしい値なのに設定しちゃうのはやめたい。//無視としよう
// comboBox1.SelectedItem = "THERMO_LEVEL";
// label_nInterlock.Text = data["THERMO_LEVEL"].ToString();
//}
//else
//{
if (retKey == null) { return; }//異常値は無処理が自然
comboBox1.SelectedItem = retKey;
label_nInterlock.Text = numericUpDown1.Value.ToString();
this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
}
}
}
第13章:Generic
[基本]
- <T>:型パラメータと呼ぶ。使用時に型を入れられる。<int>や<String>など
- しかしどんな型でも入れられるようにしておくと、対応できない場合があるので、入れられる型に制約を設ける事が出来る。この型パラメータの制約はいくつか種類がある。
[利点]
- 従来もObject型で同様の機能を行えた。しかし明示的なキャストが必要である、実行時エラーとなってしまう、等のデメリットが有りGenericの方が優れている。
[型パラメータの制約]
基本クラス制約
例えばGetA()を内部で使うので、GetA()を持つClassAとその派生クラスしか型パラメータに入れさせたくない
Class GenericClass <T> where T : ClassA // ClassAとその派生しかTに入れられない
インターフェイス制約
Class GenericClass <T> where T : IInterface // IInterfaceそのものorその派生or実装したクラスのみ型パラメータに入れさせたくない
コンストラクター制約(new()制約):
引数無しコンストラクタを持つ事を必須としている。これを付けると、内部でコンストラクタが使える=インスタンス生成できる
Class GenericClass <T> where T : new() // 引数無しコンストラクタ必須とします
参照型制約
Class GenericClass <T> where T : Class // 参照型のみTに入れられます。(ex)Class
値型制約
Class GenericClass <T> where T : Struct // 値型のみTに入れられます。(ex)intやstruct
- 作者: ハーバート・シルト,エディフィストラーニング株式会社矢嶋聡
- 出版社/メーカー: 翔泳社
- 発売日: 2010/12/03
- メディア: 大型本
- 購入: 5人 クリック: 55回
- この商品を含むブログ (6件) を見る