- PR -

DataGridに配置したDropDownListの、DataGrid内の行位置を取得したい。

投稿者投稿内容
ぶんさん
会議室デビュー日: 2004/07/27
投稿数: 11
投稿日時: 2005-07-27 11:41
Jitta様、todo様、回答を追加していただきまして、ありがとうございます。
御陰様で理解を深めることが出来ました。
ただ、Jitta様の回答からDataGridItemが見つかるまでまで上位を探す方法を考えているのですが、どの様にすればいいか考えあぐねています。
ループの中でDataGridItemが見つかるまで探すのかな?とも考えましたが
Parentを上位に上っていく方法が見つかっていません。
大変申し訳ありませんが、どの様にすべきなのか、ご教授願えないでしょうか?
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-27 11:53
コード:
public static DataGridItem FindDataGridItem(Control control) {
  while(control != null) {
    DataGridItem item = control as DataGridItem;
    if (item != null)
      return item;
    control = control.Parent;
  }
  return null;
}

ぶんさん
会議室デビュー日: 2004/07/27
投稿数: 11
投稿日時: 2005-07-27 13:58
にしざき様、回答ありがとうございます。
コードを試した結果、期待通りの値を得ることが出来ました。

自分の中では
「DropDownListを上位(と言うのでしょうか)のcontrolにキャストしてParentを確認して・・・」
と言う所までは想像出来たのですが、
「controlをDataGridItemにキャストすると型が合わないから例外で・・・え?」
と言うところで引っかかっていました。
全くのスキル不足で、
DataGridItem item = control as DataGridItem;
という使い方を知りませんでした。
本当に勉強になりました。
ありがとうございます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-27 21:25
にしざき さん:
 フォローどうもです。
> public static
しまった。。。C# だった
っつうか、Shared と static が区別付かなくなってるぞ>σ(・・?〕エッ


ぶんさん さん:
 これをするのは、テンプレートカラムなどで、コンテナコントロール(FlowPanel など)を置いてその中に配置したりしたときに、control.Parent.Parent では取得できないからです。
 それで、にしざきさんの示してくださったコード、検査用の変数を上書きしながら、while 文でブン回す、という方法はよく使う方法なので、憶えておきましょう。
 あと、typeof 演算子というものもあります。これを使うと、このようになります。
コード:
DataGridItem item = control as DataGridItem;
if (item != null)
	return item;
↓↓↓↓↓↓↓↓↓↓
if (typeof(control) is DataGridItem)
	return (DataGridItem) control;


 as 演算子と typeof ... is 演算子で、何が違うのか、というところは重要ですので、押さえておきましょう。

_________________
ぶんさん
会議室デビュー日: 2004/07/27
投稿数: 11
投稿日時: 2005-07-28 10:21
Jitta様、回答ありがとうございます。
複雑なコントロールを作成した経験が無いので、大変勉強になりました。
以前の回答で、
>Parent.Parent と決めうちせず、DataGridItem まで上位を探す方がいいかと。
と仰っていたのはこういう理由だったんですね。

また、as演算子を使った方法とtypeof...is演算子の違いについては、以下の様に考えたのですが・・・


as演算子の場合

// controlをDataGridItem型に代入するが、controlがDataGridItem型ではない場合
// itemにはnullが代入される
DataGridItem item = control as DataGridItem;
// ここでitemをnullと比較することでcontrolの型がDataGridItemであるのか判別
if (item != null)
  // controlの型がDataGridItemなので結果を返す
  return item;


typeof...is演算子の場合

// typeof演算子でcontrolの型を取得し、それがDataGridItemかを判別
if (typeof(control) is DataGridItem)
  // controlの型がDataGridItemなのでcontrolをDataGridItemにキャストして返す
  return (DataGridItem) control;


どちらの方法でも同じ結果を得ることが出来ますが、アプローチが違う?という解釈でよろしいのでしょうか?
例えば、「as演算子」か「typeof...is演算子」のどちらかを使わなければ処理できない場面というのは有るのでしょうか?

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