2012年9月30日日曜日

wpfでDataGrid

やりたいこと
DataGridにデータを登録する。
この辺に書いてあるのとは違って、データベースとかは使わないで自分で保持している配列的なものを登録する方法を紹介。
http://www.atmarkit.co.jp/fdotnet/chushin/learningdatagrid_02/learningdatagrid_02_01.html
listviewでやった方法でやってみたらできたので、これでよいのかなぁという感じですが。
step1
ツールボックスからDataGridをウィンドウにD&Dする。 D&Dしただけだと小さいので大きくする。
step2
DataGridのプロパティを表示させて、名前欄にDataGrid1と入力する。 そのあと、DataGridのXAMLに、ItemsSource="{Binding}"を追記する。

    
        

    

step3
イベントハンドラWindow_Loaded_1を追加して、次のようなコードを書く。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.Collections.ObjectModel;  
namespace gridviewtest
{
    /// 
    /// MainWindow.xaml の相互作用ロジック
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        CollectionViewSource view = new CollectionViewSource();
        ObservableCollection customers = new ObservableCollection();
        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            int itemcount = 107;
            for (int j = 0; j < itemcount; j++)
            {
                customers.Add(new Customer()
                {
                    ID = j,
                    Name = "item" + j.ToString(),
                    Age = 10 + j
                });
            }

            view.Source = customers;
            this.DataGrid1.DataContext = view;  
        }

        class Customer
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
        }  
    }
}
結果
こんな感じになる。

2012年9月29日土曜日

Visual Studio 2012 Install

いつのまにかリリースされてたので、インストールしてみました。 Visual Studio 2012 Express for Windows Desktop。
Visual Studio Express 2012 for Windows 8 こっちはwindows7にはインストールできない模様。windows 8のリリースを待つことに。

ツールボックスがモノクロになってて、なんだが使いずらい。このへんは2010のほうがよかったかも。
2010                    2012

そのた違和感を覚えた点。
・かみなりマーク(イベントハンドラ)もモノクロになったのでわかりずらかった。
・コントロールの名前がデフォルトだと空になってる。2010だとcombobox1とか勝手に名前がついてた。
・コメントアウトするアイコンがいままでと違うものになってる。

2012年9月28日金曜日

WPF で ListView

やりたいこと
WPFのListViewに見出しをつけて、項目をいれたい。 MSのサイトでやり方とサンプルコードがおいてあるので、 これをもう少し簡単に説明したい。 MSのサイトに記載されている以上のことはなにもやってないので、そちらで理解できる方はまったく見る必要なし。
◆説明
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.listview(v=vs.80).aspx
◆MSのサンプル
http://code.msdn.microsoft.com/windowsdesktop/CSWPFPaging-ce1ce482
どんなのを作るか?
Step1
ツールボックスの中のListViewをWPFのウィンドウにはっつける。
Step2
XAMLのソース(UIの下にあるXML)を以下のように書き換える。

        
            
                
                    
                    
                    
                   
                
            
        

これで見出しができる。ここまででこんな感じになる。
Step3
Loded のイベントハンドラを追加する。
Step4
あとはコードのほうに、こんな感じのソースを書く。(MSのサンプルから少し省いた。)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.Collections.ObjectModel;


namespace WpfApplication1
{
    /// 
    /// MainWindow.xaml の相互作用ロジック
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        CollectionViewSource view = new CollectionViewSource();
        ObservableCollection customers = new ObservableCollection();
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            int itemcount = 107;
            for (int j = 0; j < itemcount; j++)
            {
                customers.Add(new Customer()
                {
                    ID = j,
                    Name = "item" + j.ToString(),
                    Age = 10 + j
                });
            }

            view.Source = customers;
            this.listView1.DataContext = view;
        }
    }
    class Customer
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}
つまついた点
listviewのコントロールを貼り付けたら、あとはWindowsのFormと同じだろう。というのりでやってみたら、全然ビルドが通らなかった。

2012年9月23日日曜日

C# ウィンドウがアクティブになるのを待つ

WaitForInputIdle()
でできる。

http://www.atmarkit.co.jp/fdotnet/dotnettips/838waitidle/waitidle.html

c# 最近しったこと。

■コンボボックスのイベントで、SelectedIndexChangedだと、呼ばれすぎて困るんだけどSelectionChangeCommittedだと呼ばれないときがあって困るとき。

http://gpsoft.dip.jp/hiki/?VC.NET+%A1%C1+%A5%B3%A5%F3%A5%DC%A5%DC%A5%C3%A5%AF%A5%B9%A4%CE%C1%AA%C2%F2%CA%D1%B9%B9%A4%F2%CA%E1%C2%AA%A4%B9%A4%EB


■TTCの場合に、Glyphtypefaceを作るとき
#に何番目のフォントかを指定する。

            Uri u = new UriBuilder("file", "", -1, フォントファイルのパス, #1).Uri;
            GlyphTypeface typeface = new GlyphTypeface(u);

ttcの数を取得するようなAPIはいまのところわかってない状況。


■typefaceからfontのfamilynameを取得する
カルチャというものの指定が必要なので、とりあえず、現在のカルチャを指定して、
それだとうまく取れないフォントがおおいので、取得できないときはen-USで取得。


IDictionary dictfacename = typeface.FamilyNames;
string FamilyName = dictfacename[CultureInfo.CurrentCulture];
if (String.IsNullOrEmpty(FamilyName))
{
    CultureInfo tmpCurrentCulture = new CultureInfo("en-US", false);
    FamilyName = dictfacename[tmpCurrentCulture];
}