- PR -

キャストを作ることはできますか?

投稿者投稿内容
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-01-24 20:27
DataGridViewComboBoxColumn には
DisplayMember と ValueMember ってないのかな
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-01-24 22:08
TypeConverter or IConvertible

 しかし、なんか、違和感。
 さくら組もすみれ組も、「私のクラス」Class の参照変数ですよね。型変換は行われていませんが?単に
コード:
Private Sub R・田中一郎くんをクラス替えする()
  Dim さくら組 As New 私のクラス(1, "R・田中一郎くん")
  Dim すみれ組 As 私のクラス = さくら組
End Sub


と、同じですよね?
それとも、インスタンスを複製したい、ということなのでしょうか?→ ICloneable

 または、
コード:
Public Sub New(初期値 As String)
	Dim strs[] As String = 初期値.Split(',')
	番号 = CInt(strs[0])
	名称 = strs[1]
End Sub
# コンストラクタで例外を送出させないように、
# 文字列はもっと慎重に扱うべき


というコンストラクタを追加するとか。

 それとも、XML シリアライズする、とか。実用性の面では、これがお勧め。


引用:

#region " 番号 プロパティ "
public 番号 as integer
#end region


プロパティちゃいまんがな(^-^;

〆 written by Jitta on 2006/01/24
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-25 00:03
引用:

Hongliangさんの書き込み (2006-01-24 15:15) より:

またVB独自のキーワードが増えた……。>Narrowing/Widening
Implicit/Explicitでいいのに。


独り言にさせません。(^-^;)

敢えてフォローするならば、C# はメタデータ属性に近い記述で、
VB はヒトに近い記述... なんでしょうね。

でも、C# の sealed は final じゃないのが惜しいかな。(^^;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-01-25 10:52
引用:

R・田中一郎さんの書き込み (2006-01-24 19:23) より:

今回の場合は、DataGridView の DataGridViewComboBoxCulumn で使おうと思ったのです。
DataGridViewComboBoxCulumn.Items の Item には Object を格納できます。
ここに、番号・名称の組合せを格納したい場合、どのようにすれば良いか試行錯誤しております(現時点でも試行錯誤中です)

で、考えたのは、これらのメンバを持つ「私のクラス」を用意して、ここから生成したオブジェクトを Item に格納してみた訳です。
すると、選択肢にはオブジェクト名が表示されました。
そこで、「私のクラス」にToString() メソッドをオーバーライドしたところ、目的どおりに表示されたので気を良くしていたところ、入力後にキャストできない旨のエラーが表示されたわけです。

外部からキャストのテストをした結果は、きちんと動いたので、このスレ上では解決できたことになるのですが、実は本来の目的の DataGridViewComboBoxColumn で利用することは未だできていません。

どうすりゃいいのか、誰か知っている人がいたら教えて欲しいです。orz


ちょっと調べてみたので、見てみてください。
http://hongliang.seesaa.net/article/12239715.html



引用:

じゃんぬねっとさんの書き込み (2006-01-25 00:03) より:

でも、C# の sealed は final じゃないのが惜しいかな。(^^


メソッドじゃなくてクラスに付けるキーワードだからこれはアリかなー、とか。
//C#に甘い人です。

[ メッセージ編集済み 編集者: Hongliang 編集日時 2006-01-25 10:54 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-01-25 20:48
済みません、2006-01-24 19:23 を、軽く流していました。
引用:

R・田中一郎さんの書き込み(2006-01-24 19:23)より:

今回の場合は、DataGridView の DataGridViewComboBoxCulumn で使おうと思ったのです。
DataGridViewComboBoxCulumn.Items の Item には Object を格納できます。
ここに、番号・名称の組合せを格納したい場合、どのようにすれば良いか試行錯誤しております(現時点でも試行錯誤中です)

で、考えたのは、これらのメンバを持つ「私のクラス」を用意して、ここから生成したオブジェクトを Item に格納してみた訳です。
すると、選択肢にはオブジェクト名が表示されました。
そこで、「私のクラス」にToString() メソッドをオーバーライドしたところ、目的どおりに表示されたので気を良くしていたところ、入力後にキャストできない旨のエラーが表示されたわけです。


そういうことは最初に書きましょう。焦点がずれていますよね。

 Hongliangさんが詳細にレポートしてくださっています。デバッグの仕方、例外情報を解析するときの考え方を学ぶためにも必読です。

 でもね、データバインディングを使えば、そうそう悩まずに済むと思います。というか、使わないと損です。コードを書く必要はほとんどありません。
川俣さんの記事→第12回 ドラッグ&ドロップ一発でDB連携アプリを完全構築!
えムナウさんの記事→新グリッド・コントロールの豊富な機能と高い表現力
これら記事では対象がデータベースになっていますが、データソースの選択で「オブジェクト」を選択すればいいです。
えムナウさんの記事で、2ページ目の画面キャプチャを見てください。「顧客」をフォームにドロップすると、DataGridView になります。その中で、「性別」は ComboBox になります。

〆 written by Jitta on 2006/01/25
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-01-26 18:54
引用:

かるあさんの書き込み (2006-01-24 20:27) より:

DataGridViewComboBoxColumn には
DisplayMember と ValueMember ってないのかな



あります。とても便利そうなので、使い方を調べてみたのですが、これってデータバインディング用のプロパティみたいなんです。

引用:

Jittaさんの書き込み (2006-01-24 22:08) より:

 さくら組もすみれ組も、「私のクラス」Class の参照変数ですよね。型変換は行われていませんが?単に



クラス替えが目的というよりは、私のクラスを他の型にキャストさせる処理を自分の手で書きたかったのです。


引用:

Jittaさんの書き込み (2006-01-24 22:08) より:

#region " 番号 プロパティ "
public 番号 as integer
#end region

プロパティちゃいまんがな(^-^;



これは以前から気になっていたので確認しておきたかったのです。

僕にとって、

#region " 番号 プロパティ "
public 番号 as integer
#end region

は、

#region " 番号 プロパティ "
private _番号 as integer

public property 番号() as integer
get
return(_番号)
end get

set(byval value As integer)
_番号 = value
end set
end property
#end region

を1行に縮められる魔法の言葉だと思っているのですが、この考え方はどこか間違えているのでしょうか。

引用:


Jittaさんの書き込み (2006-01-25 20:48) より:

済みません、2006-01-24 19:23 を、軽く流していました。



いえいえ、あやまられる程のことではありませんよ。

引用:


Jittaさんの書き込み (2006-01-25 20:48) より:

そういうことは最初に書きましょう。焦点がずれていますよね。



済みません。僕としては、結構いい線行っていると思っていたのですが。
でも、キャストをカスタマイズする方法も知りたかったので、これはこれで解決できてよかったです。

引用:


Jittaさんの書き込み (2006-01-25 20:48) より:

 でもね、データバインディングを使えば、そうそう悩まずに済むと思います。というか、使わないと損です。コードを書く必要はほと



ありがとうございます。確かに便利ですよね。
実は、この記事は読んだのですが、僕は以前からデータバインディングがあまり好きになれないんです。
ちなみに、データバインディングを使う場合、性別もテーブルに持つことになるんでしょうか。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-01-26 18:54
引用:


Hongliangさんの書き込み (2006-01-25 10:52) より:

ちょっと調べてみたので、見てみてください。
http://hongliang.seesaa.net/article/12239715.html



ちょっとどころか、全て解決してありますね。
これをちょっとと言うのは、ある意味凄いことです。
僕が途中で躓いた先まで全て調べて解決して下さっていますね。
しかも丁寧な解説までついています。

とても感謝しております。本当にありがとうございました。

おかげ様で、問題は解決したのですが、実は、ここで取得した値を使う部分で更に躓いています。

諸々、処理を書いていると、Object 型を通して他のメソッドに渡すなどの処理が多数にあることに気づきました。
ComboItem は、ComboItem 型であるけれど、id の型の integer ように振舞えれば、とても素敵です。

dim 性別 as integer = CType(view.CurrentCell.Value, ComboItem).id

本来、上記のように書くのを

dim 性別 as integer = CType(view.CurrentCell.Value, Integer)

このように書いてもOKとすることは、可能なものでしょうか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-26 19:32
引用:

R・田中一郎さんの書き込み (2006-01-26 18:54) より:

1行に縮められる魔法の言葉だと思っているのですが、この考え方はどこか間違えているのでしょうか。


考え方として正しいかどうかで言えば、そのクラスでの役割次第でしょう。
今回の例はインスタンス メンバなので「間違っている」に意見が傾きそうです。

概念上の話から実装レベルの話まで混ぜて話します。
私ではうまく説明できないかもしれません... (毎度のことですがw)

さて、そのクラスで "公開されている" インスタンスなメンバである以上は、
やはりプロパティとして "明示化" すべきだと思います。

.NET Framework のクラス ライブラリを見てください。
フィールド メンバは、インスタンス メンバではなく、static なメンバである場合が殆どです。
それも readonly なメンバ、constant なメンバばかりじゃないでしょうか?
これらのメンバはインスタンスとしての財産という概念を持ち合わせていないからです。

プロパティを実装することで、間に副作用を挟む余地が生まれるというのも利点でしょう。
たとえば、バインディング、コントロールで言えば視覚変化などですね。

ただし、private なメンバは別です。
これらは外部に関与しないため、"将来的にも" 副作用を期待しないのであればフィールドでも良いでしょう。
(それでも、プロパティにしてしまいますが)

それと、プロパティによる実装をすると JIT コンパイルで最適化されることがあるようです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)