2012年8月16日木曜日

c#でファイルのコピー(Fileクラス,FileInfoクラス、FileStreamクラス)

今回はファイルのコピー方法を確認。

ファイルをコピーする方法はいくつかあるようで、FileクラスとFileInfoクラスを使ってコピーするのが一般的なのでしょうか?

ネットで探すと大体このふたつの記事に行き着きますね。
そこで、このふたつのクラスを使ったファイルのコピー方法と、
FileStreamを使ったコピー方法のまとめ。

FileStreamを使ってコピーすることは、あまりないのかもしれません。
あくまで、FileStreamの使い方の勉強ってことで。


■ファイルのコピー(Fileクラス)

FileクラスのCopyメソッドを利用したコピー方法は、パラメータで
「コピー元のファイル/コピー先のファイル/上書き可or不可」を指定する。

static void Main(string[] args)
{
    string sourceFileName = @"e:\sample.txt";
    string destFileName = @"e:\sample_copy.txt";
    bool overwrite = true;

    File.Copy(sourceFileName, destFileName, overwrite);
}



■ファイルのコピー(FileInfoクラス)

Fileクラスでのコピー方法と違う部分は、一度インスタンスを生成してからメソッドを利用する点。
コンストラクタのパラメータで「コピー元のファイル」を指定し、
CopyTOメソッドのパラメータで「コピー先ファイル」と「ファイルの上書き可or不可」を指定する。

ちなみに、msdnでFileInfoクラスの解説部分を読むと、
「オブジェクトを使いまわす場合はFileクラスの静的メソッドのかわりにFileInfoのインスタンスメソッドを使用することを検討してください。」と書いてある。

理由は、FileInfoのインスタンスメソッドを使用すると、必ずしもセキュリティチェックが必要でなくなるから。だそうです。

ということは、Fileクラスを利用する場合は毎回チェックされるということなのかな?
処理が重くなるのか?不明です。

static void Main(string[] args)
{
    string sourceFileName = @"e:\sample.txt";            
    string destFileName = @"e:\sample_copy.txt";
    bool overwrite = true;

    FileInfo fileInfo = new FileInfo(sourceFileName);
    fileInfo.CopyTo(destFileName, overwrite);
}


■ファイルのコピー(FileStreamクラス)

最後にFileStreamでコピーする方法。上の二つを見たら、これを使うことはないでしょうね。

ちなみに、msdnでFileStream.Read メソッドのページを見ると。
戻り値の部分の説明文では、「ストリームの末尾に到達した場合は 0 になることがあります。」とあいまいな感じなのに、解説の部分では、「ストリームの末尾に到達した後に必ず 0 を返します。」とキッパリ言ってる。どっちなの?

ちゃんと英語読めるようになれってことですね(笑)

static void Main(string[] args)
{
    string sourceFileName = @"e:\sample.txt";
    string destFileName = @"e:\sample_copy.txt";
    byte[] buffer = new byte[256];
    int readCount = 0;

    using (FileStream fsSource = new FileStream(sourceFileName, FileMode.Open))
    {
        using (FileStream fsDest = new FileStream(destFileName, FileMode.Create))
        {
            while((readCount = fsSource.Read(buffer, 0, buffer.Length)) != 0)
            {
                fsDest.Write(buffer, 0, readCount);
            }
        }
    }
}


2012年8月11日土曜日

C# DataGridViewコントロールにデータを追加する


C#の勉強をはじめて、1カ月くらいになりますがDataGridViewコントロールがいまいちわからない。
なので、少しずつ勉強。





まずは、簡単にデータグリッドを使う方法から勉強。
具体的には、IDEをつかってデータグリッドビューに列を追加し、コードで行データを追加する方法の確認。


DataGridViewコントロールをフォームに追加する。



追加したDataGridViewをクリックすると右上に小さなボタンが表示されるので、これをクリック。

列の編集をクリック。



列の編集ダイアログが表示されるので、[追加]ボタンをクリック。



データグリッドビューに直接(プログラムから)データを追加する場合は「非バインド列」を選択し
「名前」、「型」、「ヘッダーテキスト」を入力して[追加]ボタンをクリックする。
(この作業を追加する列のかず繰り返す)

「名前」はデータグリッドビューの特定の列の値を取得するときにプログラムで利用する「列名」。
「型」は作成する列に追加するデータの型を指定する。
「ヘッダーテキスト」はデータグリッドビューに表示される「列名」。


列の編集ダイアログにもどると作成した列が左側に表示される。


これで、データグリッドビューに列を追加が完了。
つづけて、プログラムから行を追加する。

行の追加は、
DataGridViewRowCollection.Addメソッド」を利用する
(下図の赤丸部分)



実行すると次のようになる。

2012年8月10日金曜日

C# TreeViewコントロールの項目にアイコンを追加する

今回は、TreeViewコントロールの項目にアイコンを追加する方法を勉強。



利用するコントロールは
・TreeView
・ImageList
の2つ



まず、ツリービューで表示したいアイコンをImageListコントロールのインスタンスに追加します。
imageList1をクリックし、プロパティウィンドウのImagesプロパティをクリックします。すると[...]ボタンが表示されるので、これをクリック。

イメージコレクションエディターが表示されるので、[追加]ボタンをクリックし、使用するアイコンを選択します。


指定したアイコンが表示されます。この作業を利用したいアイコンの数くりかえします。



利用するアイコンをすべて追加したら、コードを編集します。

■コード
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //リストビューに表示するアイコンのリストを設定する
            treeView1.ImageList = this.imageList1;

            //リストビュー全体で利用するアイコンの設定
            treeView1.ImageIndex = 0;
            treeView1.SelectedImageIndex = 0;

            TreeNode n1 = new TreeNode("項目1");
            TreeNode n2 = new TreeNode("項目2");

            //ノードごとに個別のアイコンを設定する
            n1.Nodes.Add(new TreeNode("項目1-1", 1, 1));
            n1.Nodes.Add(new TreeNode("項目1-2", 1, 1));

            treeView1.Nodes.Add(n1);
            treeView1.Nodes.Add(n2);
        }
    }
}

treeView1.ImageList = this.imageList1;の部分が
imageList1に追加したアイコンをリストビューに表示するアイコンとして設定している部分。
。この設定でimageList1に追加したアイコンがツリービューでも利用できるようになる。

treeView1.ImageIndex = 0;
treeView1.SelectedImageIndex = 0;の部分がリストビューの全項目で表示するアイコンを指定する部分。ImageIndexが通常時のアイコンの指定で、SelectedImageIndexが選択中の項目で表示するアイコンの指定。インデックスで指定する数値は、アイコンの登録時に表示されていた数値です。

なお、項目ごとに違うアイコンを表示させたい場合は、

「new TreeNode("項目1-1", 1, 1)」のようにTreeNodeクラスのインスタンス生成時の第二引数と第三引数で指定する。

C# TreeViewコントロールに項目を追加する

ここでは、TreeViewコントロールに項目を追加する方法を紹介します。


TreeViewコントロールに項目を追加するには、

1.「TreeNode」クラスを利用して追加したい項目を作成。
2.「treeView1.Nodes.Add」メソッドを利用して、作成した項目をリストビューに追加。
(“treeView1”はTreeViewクラスのインスタンス)

なお、1で作成した項目にさらに項目を追加する(入れ子にする)には、
「n1.Nodes.Add」メソッドを利用する。
(n1はTreeNode)

■ソース
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //1.「TreeNode」クラスを利用して追加したい項目を作成
            TreeNode n1 = new TreeNode("項目1");
            TreeNode n2 = new TreeNode("項目2");

            //項目の中に項目を追加(入れ子にする)
            n1.Nodes.Add(new TreeNode("項目1-1"));
            n1.Nodes.Add(new TreeNode("項目1-2"));

            //2.作成した項目をリストビューに追加
            treeView1.Nodes.Add(n1);
            treeView1.Nodes.Add(n2);
        }
    }
}




C# ListViewコントロールの使い方(項目追加)

ListViewコントロールに項目を追加する方法。

ここでは、各列の「タイトルの追加方法」と「項目の追加方法」の2つを紹介します。


まず、「タイトルの追加方法」。

リストビューの列タイトルは、「listView1.Columns.Add」メソッドで指定します。
(listView1は「ListView」クラスのインスタンス変数)


つぎは、「項目の追加方法」。


リストビューに項目を追加するには、「listView1.Items.Add」メソッドで指定します。
(listView1は「ListViewクラス」のインスタンス変数)

■ソース


using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //ListViewコントロールの設定
            listView1.View = View.Details;

            //カラムの設定(3列)
            listView1.Columns.Add("列1");
            listView1.Columns.Add("列2");
            listView1.Columns.Add("列3");

            //リスト項目の設定
            string[] row_1 = { "1行目_列1", "1行目_列2", "1行目_列3" };
            string[] row_2 = { "2行目_列1", "2行目_列2", "2行目_列3" };
            string[] row_3 = { "3行目_列1", "3行目_列2", "3行目_列3" };
            listView1.Items.Add(new ListViewItem(row_1));
            listView1.Items.Add(new ListViewItem(row_2));
            listView1.Items.Add(new ListViewItem(row_3));
        }
    }
}

ちなみに、リストビューコントロールの「View」プロパティを変更すると次のように表示が変わる。

View:Details

View:LargeIcon

View:List

View:SmallIcon

View:Title