- PR -

PostBackしたときに追加した情報を取得したい

1
投稿者投稿内容
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2004-06-17 15:19
お世話になっています。
msoです。

ASP.NET(vs2002で開発)しています。
分からないことがあり、質問をさせていただきます。

作成しているASPの中で
<asp:checkbox id="whoge" runat="server" Customer='testData1'/>
というように記述をしました。
これをPostBackした時にCustomerのデータを取得するには

((System.Object)(((System.Web.UI.StateItem)(((System.Collections.Specialized.ListDictionary.NodeKeyValueCollection)(((System.Collections.ICollection)(((System.Web.UI.AttributeCollection)(((System.Web.UI.WebControls.WebControl)(whoge)).Attributes)).Keys)))).list.head.value)).Value))

とすればデータを取得できるようなのです。
(クイックウォッチで参照しました)
ただ、あまりにスマートさに欠けるので、もっと簡潔にデータを取得することができるなら
教えていただきたいのですが、どうすれば良いのでしょうか?

#変換ミスを訂正

[ メッセージ編集済み 編集者: mso 編集日時 2004-06-17 16:23 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-06-17 16:04
whogeという名前のコントロールを扱っているようには見えないんですが・・・
"chkBox"というのはwhogeの間違いですか?

AttributeCollectionのItemプロパティで"Customer"をキーにして値を取るのはだめでしょうか。
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2004-06-18 14:47
msoです。

引用:

一郎さんの書き込み (2004-06-17 16:04) より:

AttributeCollectionのItemプロパティで"Customer"をキーにして値を取るのはだめでしょうか。



attribute.addでCustomerを追加は出来たのですが、
追加した値を取得することができません。

repeaterコントロール上にあるCheckBoxに追加をして、
this.repeater.Items[cnt].FindControl("whoge")
とまではたどり着いたのですが、その後でどうやってCustomerの値を取得すれば
良いのでしょうか?

Webサーバコントロールを使用しているので、ViewStateに値があるはずなので
なんとかすればデータを取得することが出来ると悩んでいます。
this.repeater.Items[cnt].FindControl("whoge").FindControl("Customer").Value
みたいな取得方法ができるのでしょうか?
#実際にはValueがなかったので、ほかの方法になると思います。




todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-06-18 15:15
引用:

msoさんの書き込み (2004-06-18 14:47) より:
attribute.addでCustomerを追加は出来たのですが、


AttributeではなくViewStateを使うのはどうでしょう。

whoge.ViewState["Customer"] = "testData1";

引用:

Webサーバコントロールを使用しているので、ViewStateに値があるはずなので
なんとかすればデータを取得することが出来ると悩んでいます。



本当?
クイックウォッチでwhoge.ViewState以下を覗いてみては?
---
追記

CheckBox.ViewStateはproetctedでした。

CheckBoxを継承するカスタムコントロールで

public string Customer
{
get {
return (string)ViewState["Customer"];
}
set {
ViewState["Customer"] = value;
}
}

[ メッセージ編集済み 編集者: todo 編集日時 2004-06-18 15:28 ]
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2004-06-18 15:28
引用:

msoさんの書き込み (2004-06-18 14:47) より:
msoです。


Webサーバコントロールを使用しているので、ViewStateに値があるはずなので
なんとかすればデータを取得することが出来ると悩んでいます。
this.repeater.Items[cnt].FindControl("whoge").FindControl("Customer").Value
みたいな取得方法ができるのでしょうか?



一郎さんが書かれている方法でできませんか?
コントロールさえとれればいけると思います。

CheckBox cb = this.repeater.Items[cnt].FindControl("whoge");
string s = cb.Attributes["Customer"];
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2004-06-18 17:26
msoです。

引用:

まるくさんの書き込み (2004-06-18 15:28) より:

一郎さんが書かれている方法でできませんか?
コントロールさえとれればいけると思います。

CheckBox cb = this.repeater.Items[cnt].FindControl("whoge");
string s = cb.Attributes["Customer"];




具体的なコードありがとうございます。
ただ、まだうまくいかないためもう少し知恵を分けてください。

string s = cb.Attributes["Customer"];
とやったところ、sには""(String.Empty)が返ってきます。
実際にHTMLを見て、whogeのCheckBoxのCustomerにデータが
入っているのは確認しました。

ただ、何か私がおかしいことをしていると思うのですが、
未だに原因がつかめません。

申し訳ありませんが、よろしくお願いします。
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2004-06-18 22:39
引用:

msoさんの書き込み (2004-06-18 17:26) より:
msoです。

ただ、何か私がおかしいことをしていると思うのですが、
未だに原因がつかめません。




処理順序に問題があったり、PostBack時にDataBindしたりしていませんか?
当方テストコードを書いてみましたが正常に動作しました。VS.NET2003上ですけれど。

//■■■HTML
<form id="Form1" method="post" runat="server">
<asp:repeater id="Repeater1" runat="server">
<ItemTemplate>
<asp:checkbox id="whoge" runat="server"></asp:checkbox>
<asp:TextBox ID="txt" Runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "NM")%>'></asp:TextBox>
<br>
</ItemTemplate>
</asp:repeater>
<asp:button id="Button1" Text="Button" runat="server"></asp:button>
<asp:textbox id="TextBox1" runat="server"></asp:textbox>
</form>

//■■■ビハインドコード
private void Page_Load(object sender, System.EventArgs e)
{
// ページを初期化するユーザー コードをここに挿入します。
if (!this.IsPostBack)
{
//初期表示時
DataTable dt = new DataTable();
dt.Columns.Add("CD");
dt.Columns.Add("NM");

DataRow dr = null;

dr = dt.NewRow();
dr["CD"] = "01";
dr["NM"] = "顧客01";
dt.Rows.Add(dr);

dr = dt.NewRow();
dr["CD"] = "02";
dr["NM"] = "顧客02";
dt.Rows.Add(dr);

this.TextBox1.Text = "";

this.Repeater1.DataSource = dt;
this.Repeater1.DataBind();

//Attributesセット
int i = 0;
foreach (RepeaterItem ri in this.Repeater1.Items)
{
CheckBox cb = (CheckBox)ri.FindControl("whoge");
cb.Attributes.Add("Customer", "TestData" + (i++));
}
}
else
{
//PostBack時
foreach (RepeaterItem ri in this.Repeater1.Items)
{
CheckBox cb = (CheckBox)ri.FindControl("whoge");
this.TextBox1.Text += cb.Attributes["Customer"] + ";";
}
}
}
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2004-06-21 09:30
引用:

まるくさんの書き込み (2004-06-18 22:39) より:
引用:

msoさんの書き込み (2004-06-18 17:26) より:
msoです。

ただ、何か私がおかしいことをしていると思うのですが、
未だに原因がつかめません。




処理順序に問題があったり、PostBack時にDataBindしたりしていませんか?
当方テストコードを書いてみましたが正常に動作しました。VS.NET2003上ですけれど。





わざわざテストコードありがとうございます。
VS2002でも期待通りの動作をすることがわかりました。
ただ、私の作成しているプログラムではまだ期待通りには動作をしないことから
何か手順が悪いと考えています。

何が悪いのかはもうちょっと調べてみないといけないのですが、
解決することが出来そうです。
ありがとうございます。
1

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