- - PR -
PostBackしたときに追加した情報を取得したい
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2004-06-17 16:04
whogeという名前のコントロールを扱っているようには見えないんですが・・・
"chkBox"というのはwhogeの間違いですか? AttributeCollectionのItemプロパティで"Customer"をキーにして値を取るのはだめでしょうか。 | ||||||||
|
投稿日時: 2004-06-18 14:47
msoです。
attribute.addでCustomerを追加は出来たのですが、 追加した値を取得することができません。 repeaterコントロール上にあるCheckBoxに追加をして、 this.repeater.Items[cnt].FindControl("whoge") とまではたどり着いたのですが、その後でどうやってCustomerの値を取得すれば 良いのでしょうか? Webサーバコントロールを使用しているので、ViewStateに値があるはずなので なんとかすればデータを取得することが出来ると悩んでいます。 this.repeater.Items[cnt].FindControl("whoge").FindControl("Customer").Value みたいな取得方法ができるのでしょうか? #実際にはValueがなかったので、ほかの方法になると思います。 | ||||||||
|
投稿日時: 2004-06-18 15:15
AttributeではなくViewStateを使うのはどうでしょう。 whoge.ViewState["Customer"] = "testData1";
本当? クイックウォッチで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-06-18 15:28
一郎さんが書かれている方法でできませんか? コントロールさえとれればいけると思います。 CheckBox cb = this.repeater.Items[cnt].FindControl("whoge"); string s = cb.Attributes["Customer"]; | ||||||||
|
投稿日時: 2004-06-18 17:26
msoです。
具体的なコードありがとうございます。 ただ、まだうまくいかないためもう少し知恵を分けてください。 string s = cb.Attributes["Customer"]; とやったところ、sには""(String.Empty)が返ってきます。 実際にHTMLを見て、whogeのCheckBoxのCustomerにデータが 入っているのは確認しました。 ただ、何か私がおかしいことをしていると思うのですが、 未だに原因がつかめません。 申し訳ありませんが、よろしくお願いします。 | ||||||||
|
投稿日時: 2004-06-18 22:39
処理順序に問題があったり、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"] + ";"; } } } | ||||||||
|
投稿日時: 2004-06-21 09:30
わざわざテストコードありがとうございます。 VS2002でも期待通りの動作をすることがわかりました。 ただ、私の作成しているプログラムではまだ期待通りには動作をしないことから 何か手順が悪いと考えています。 何が悪いのかはもうちょっと調べてみないといけないのですが、 解決することが出来そうです。 ありがとうございます。 |
1