- PR -

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

投稿者投稿内容
ぶんさん
会議室デビュー日: 2004/07/27
投稿数: 11
投稿日時: 2005-07-26 16:56
お世話になっております。

早速ですが、表題の件について何方かご教授願います。
現在、VS.NET2003のC#でWebアプリの開発を行っています。
DataGridのItemTemplateにDropDownListを追加して表示させていますが、
DropDownListの選択内容はSelectedIndexChangedイベントを追加することで取得できたのですが、
同じイベント内でSelectedIndexChangedイベントが発生したDropDownListが配置されているDataGridの
行番号の取得方法が分かりません。
似たような事をやっている過去ログは見つけたのですが、それをDropDownListに適用する事が出来ていない状態です。
(http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19002&forum=7)

イベントの追加方法とイベントの内容は以下の通りです。

<ItemTemplate>
<asp:DropDownList id=Dropdownlist2 runat="server" DataMember="Dropdown" DataSource="<%# dataSet11 %>" OnSelectedIndexChanged="DropDownList2_SelectedIndexChanged" AutoPostBack="True" DataValueField="value" DataTextField="text">
</asp:DropDownList>
</ItemTemplate>

protected void DropDownList2_SelectedIndexChanged(object sender, System.EventArgs e)
{
  this.dataSet11 = (DataSet1)ViewState["dataset11"];
  DropDownList dl = (DropDownList)sender;
  string vl = dl.SelectedValue;
  // ここ以降でDataGridの行番号を取得したい。
}

宜しくお願いします。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-26 17:39
DropDownList から Parent を 1個(か 2個:忘れたけど)たどると
DataGridItem クラスにあたるはずなので、
これの ItemIndex を参照すればいいかと思います。
未検証ですが、
コード:
((DataGridItem)dl.Parent).ItemIndex


のような感じかと。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-26 17:41
td があって tr があるから 2個か。
じゃ、
コード:
((DataGridItem)dl.Parent.Parent)

で。
ぶんさん
会議室デビュー日: 2004/07/27
投稿数: 11
投稿日時: 2005-07-26 18:19
にしざき様
回答ありがとうございます。
早速試した結果、想定通りの内容を取得する事が出来ました。
この方法は他でも使うことがあると思いますので、念のためお聞きしたいのですが、

・DataGridをWebで表示するとTableとして表示される

と言う前提から、

<table>   ←DropDownListの二つ上のParentがここ
 <tr>    ←DropDownListの一つ上のParentがここ
  <td></td> ←ここに対象のDropDownListがある
 </tr>
<table>

と言うことで、DropDownListを含むDataGridが

((DataGridItem)dl.Parent.Parent)

となるのですよね?

※((DataGridItem)dl.Parent.Parent).ItemIndexと記述すると、DataGridのイベントが走る訳でもないのにどうしてItemIndexが設定されているのか?と言うところはまだ理解できていませんが・・・
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-07-26 18:35
正確には
DataGrid
-DataGridItem
--なにか(忘れました)
---DropDownList
というオブジェクト関連があって、
それぞれが(たまたま)
table
-tr
--td or th
---select
を描画することになります。
一般には HTML の構造からは ASP.NET の親子関係を直接には
導けないのですが、今回の場合はこれを覚えていたのでそこから
逆算したためにあんな書き方になっていました。

後段については、ViewState から構造を復元する際に
ItemIndex が設定されることになります。
ぶんさん
会議室デビュー日: 2004/07/27
投稿数: 11
投稿日時: 2005-07-26 19:08
にしざき様
早速の回答ありがとうございます。
にしざき様の回答を元に勉強してみます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-07-26 19:56
Parent.Parent と決めうちせず、DataGridItem まで上位を探す方がいいかと。
で、それを public shared なメソッドにしておく、と。
_________________
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-07-26 20:00
<table>   
 <tr> ←DropDownListの二つ上のParentがここ     
  <td> ←DropDownListの一つ上のParentがここ
<select></select> ←対象のDropDownList
</td> 
 </tr>
<table>

対象のDropDownListがr行c列にあるとすると

dl.Parentの実体は MyDataGrid.Items[r].Cells[c]
dl.Parent.Parentの実体はMyDataGrid.Items[r]



[ASP.NET]DataGridコントロールの各セルにアクセスするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/064dgcell/dgcell.html


[ メッセージ編集済み 編集者: todo 編集日時 2005-07-26 20:01 ]

[ メッセージ編集済み 編集者: todo 編集日時 2005-07-26 20:10 ]

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