2017年08月 / 07月≪ 12345678910111213141516171819202122232425262728293031≫09月

インフォメーション

FC2ブログで画像等を一括アップロードするソフトを地味に配布してます。
FC2ブログ用ファイルアップロードの最新版はこちら
(ベクター)FC2ブログ用ファイルアップロード

--.--.-- (--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


 |  --:--  |  スポンサー広告  |  Top↑

2011.11.03 (Thu)

デザイナで配置できるコントロールを作ったらコンストラクタが2回呼ばれる

デザイナで配置できる自作コントロールを作ると、デザイナで配置した時と実行したとき、計2回コンストラクタが呼ばれることになるみたい。

DataGridViewを継承したコントロールを作ってみた場合。
デフォルトで列が2個追加されてるみたいなやつ。
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
class MyDataGridView : DataGridView
{
public MyDataGridView()
: base()
{
this.Columns.Add("col1", "列1");
this.Columns.Add("col2", "列2");
}
}
}

ソリューションのビルドするとツールボックスに表示されてデザイナで配置できる状態になるので、配置。
配置時に既に勝手に列が2個ある。
uw000043.jpg

これをそのまま実行すると
uw000042.jpg

勝手に増えてる!

デザイナで配置するときだけ列を追加したい・・・配置時だけ動かしたい処理はInitLayout()をoverrideするといいみたい。
ヘルプには
継承時の注意 派生クラスで InitLayout をオーバーライドする場合は、基本クラスの InitLayout メソッドを呼び出して、コントロールが正しく表示されるようにしてください。

て書いてあるので、base.InitLayout()を忘れずに。
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
class MyDataGridView : DataGridView
{
public MyDataGridView()
: base()
{
// こっちをやめて
//this.Columns.Add("col1", "列1");
//this.Columns.Add("col2", "列2");
}

protected override void InitLayout()
{
// ベースのInitLayout
base.InitLayout();

// こっちに入れる
this.Columns.Add("col1", "列1");
this.Columns.Add("col2", "列2");

}
}
}

これでビルドして配置しなおせば
uw000044.jpg
増えなくなった。っていうメモ。

あ、でもデザイナでプロパティとか変更したりすると再度InitLayoutが呼ばれて列が増えちゃう。
protected override void InitLayout()
{
// ベースのInitLayout
base.InitLayout();

// こっちに入れる
if(!this.Columns.Contains("col1"))
this.Columns.Add("col1", "列1");
if (!this.Columns.Contains("col2"))
this.Columns.Add("col2", "列2");
}

こういう対応しておけば安心かな
スポンサーサイト


 |  13:02  |  C#.NET  |  トラックバック(0)  |  コメント(0)  |  Top↑

2011.09.02 (Fri)

C#.NETでwebカメラを使いたい(AForge.NET)

C#.NETでwebカメラから画像読み取りたいなあと思って調べてみた。

USBカメラをC#で使おう
↑ここを参考にコードを書いてみたけど難しいしよくわからん。
サンプルのソースをビルドして動かしてみたらエラーで止まられてなんか心が折れた。

結構古い記事なので、今ならもっと便利かつ簡単に使えるやつがでてんじゃない?と思って探したらあった。
AForge.NETというものを使う方法。
使い方は↓
Webcam in C#: AForge.NET « hary.oktav’s Blog
これならコードも少ない!わかりやすい!英語読めなくてもわかる!

参照にAForge.Video.dllとAForge.Video.DirectShow.dllを追加して
下の方の画像のように、フォームにコンボボックスとボタン2個とラベルとピクチャーボックスとタイマーを張り付けて
コード書く。

こんな便利なもん・・・もっと検索で引っかかりやすくして!


 |  22:49  |  C#.NET  |  トラックバック(0)  |  コメント(2)  |  Top↑

2011.08.16 (Tue)

FormClosingとFormClosed

フォームを閉じる際、自動で設定を保存する処理とか入れるにはFormClosingとFormClosedのどっちのイベントに入れた方が適当なのかなと思ったのでメモ。

ヘルプから抜粋


FormClosing イベント
フォームが閉じる前に発生します。
FormClosing イベントは、フォームが閉じている間に発生します。フォームが閉じられると、そのフォームは破棄され、関連付けられたすべてのリソースが解放されます。このイベントをキャンセルすると、フォームは開いたままになります。フォームを閉じる操作をキャンセルするには、イベント ハンドラに渡される FormClosingEventArgs の Cancel プロパティを true に設定します。

FormClosed イベント
フォームが閉じた後に発生します。
FormClosed イベントは、ユーザー、Close メソッド、または Application クラスの Exit メソッドによってフォームが閉じられた後に発生します。フォームが閉じないようにする場合は、FormClosing イベントを処理し、イベント ハンドラに渡される CancelEventArgs の Cancel プロパティを true に設定します。

このイベントを使用して、フォームで使用されていたリソースを解放したり、フォームに入力された情報を保存したり、親フォームを更新したりできます。



なるほど、FormClosedを利用しろと思いっきり書いてあった。
閉じられようとした際にやっぱ閉じるのやめようとかする場合にFormClosing,
閉じられるの前提で後処理するのがFormClosedって感じか。


 |  21:58  |  C#.NET  |  トラックバック(0)  |  コメント(0)  |  Top↑

2010.08.14 (Sat)

DataGridViewでセルの値によってセルの色を変えたりする

セルに入ってる値から判断条件によってそのセルの文字色とか背景色を変えたい場合、
(Excelでいう条件付書式みたいな感じ)
CellFormattingイベントを使うのが一般的なんだろうか?
なんかよく使いそうな処理なんだが、これだって言うプロパティが見つからないし。

品名列と値段列があって、
・品名の先頭に「*」が付いてたら赤文字にする
・値段 > 500だったら背景をピンクにする
という処理を入れてみた。
こんな感じ。
uw000016_20100813075605.jpg

動作はなかなかよさげ。
バインド元を変えても、手動で入れた値に対してもちゃんと表示してくれる。
nullとかDBNullとかに気をつければ特に問題ない。と思う。
ソースは↓

 |  07:56  |  C#.NET  |  トラックバック(0)  |  コメント(0)  |  Top↑

2010.07.23 (Fri)

DataGridViewのDataSourceに独自クラスのListを指定する場合

DataGridViewのDataSourceに独自クラスのList<>を入れる場合、
そのまま入れると、Listのデータを変更した際勝手にDataGridViewに反映されないのでめんどくさい。
そんなときはBindingSourceクラスを噛ませるといい感じ。
↓続き

 |  20:24  |  C#.NET  |  トラックバック(0)  |  コメント(2)  |  Top↑
 | BLOGTOP |  NEXT
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。