none
GridView内のtextboxの値が取れないのですが RRS feed

  • 質問

  • どうしたらいいのでしょうか。まずgridviewの一列の構造が下記です。

      <asp:TemplateField HeaderText="ORDER NUM">
                                    <EditItemTemplate>
                                     
                                    </EditItemTemplate>
                                    <AlternatingItemTemplate>
                                        <asp:LinkButton ID="LinkButton2" runat="server" Text='<%# Eval("ORDER NUM") %>'></asp:LinkButton>
                                    </AlternatingItemTemplate>
                                    <ItemTemplate>
                                        <asp:LinkButton ID="LinkButton1" runat="server" Text='<%# Eval("ORDER NUM") %>'></asp:LinkButton>
                                    </ItemTemplate>
                                    <FooterTemplate>
                                        <asp:TextBox ID="m_message" runat="server" Width="105px"></asp:TextBox>
                                    </FooterTemplate>
                                </asp:TemplateField>

    footer部にtextboxを追加しました。

    そしてtextboxに入力してボタンクリック時のコードが下記です。

    protected void Button1_Click(object sender, EventArgs e)
        {
            GridViewRow row = GridView1.FooterRow;
            string value = ((TextBox)row.Cells[1].Controls[0].FindControl("m_message")).Text;
        }

    valueは""です。controls[0]を省いたりいろいろやってみているのですが、どうしても値が取得できません。他の列のfooter部のボタンコントロール(Button1)をFindControlしたところtextが取得できています。(ここではGoが取得)。

     

    2007年7月9日 7:49

すべての返信

  • 実行時エラーが出ないということは、TextBoxへの参照は得られているわけですから、どこかで入力した値がクリアされているのではないでしょうか?

    例えばこのTextBoxの初期化を、ポストバック時にも行っていませんか?

    2007年7月10日 1:35
    モデレータ
  • アドバイスありがとうございます。その後もテストとして、とにかくどこのイベントでもいいからtextboxの値を取ろうと考えました。(下記)

     protected void Button1_Click(object sender, EventArgs e)
        {
            GridViewRow row = GridView1.FooterRow;
            string value = ((TextBox)row.Cells[1].FindControl("m_message")).Text;
        }

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.Footer)
            {
                string value = ((TextBox)e.Row.Cells[1].FindControl("m_message")).Text;
            }
        }
        protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.Footer)
            {
                string value = ((TextBox)e.Row.Cells[1].FindControl("m_message")).Text;
            }
        }
        protected void GridView1_PreRender(object sender, EventArgs e)
        {
            GridViewRow row = GridView1.FooterRow;
            string value = ((TextBox)row.Cells[1].FindControl("m_message")).Text;
        }
        protected void GridView1_DataBound(object sender, EventArgs e)
        {
            GridViewRow row = GridView1.FooterRow;
            string value = ((TextBox)row.Cells[1].FindControl("m_message")).Text;
        }
        protected void GridView1_Load(object sender, EventArgs e)
        {
            GridViewRow row = GridView1.FooterRow;
            string value = ((TextBox)row.Cells[1].FindControl("m_message")).Text;
        }

    全てにブレークポイントを置いて調べましたが、全てのイベントにおいてtextboxの値は""です。(空、empty)

    とにかく最初から値が取れていません。エラーにもならないのでどこかでリセットされているのでしょうがよくわかりません。

     

    2007年7月10日 2:42
  • こちらで試したところ、問題なく取得できます。一度、C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 以下にある当該のテンポラリフォルダを消してみるとどうなりますでしょうか?

    2007年7月10日 3:09
    モデレータ
  • 教えていただいたtemporary asp.net filesが削除出来ませんでした。読み取り専用のチェックを外しましたが、「website2が削除できません。アクセスできません。」メッセージでした。このファイルはいったい何なのでしょうか。
    2007年7月10日 6:04
  • Visual Studioで開いていると削除できません。Visual Studioが掴んでいるからです。簡単に言えば、ASP.NETはtemporary asp.net filesにある当該フォルダにソースを動的に生成してコンパイルを行い、実行モジュールを生成しています。そこがおかしくなると生成されたソースの整合性が取れなくなり、おかしな動作をする場合があります。そこで、一度そこを全て削除することにより、1からソースを生成し直さすわけです。

     

    さて、GridViewのFooterにTextBoxを追加して、その値を取得するだけの簡単なページを作成して、そこで動作を確認してみると、不具合の原因を切り分けられるのではないかと思います。

    2007年7月10日 12:21
    モデレータ
  • という事は、一度Visual Studioを閉じてからファイルを削除するのでしょうか。それと、temporary asp.net filesのwebsite2のファイルは全て削除しても支障はないという事ですよね?早速、家のPCで試してみます!trapemiyaさん、ありがとうございます。
    2007年7月11日 1:49
  • その後、temporary asp.net filesのwebsite2を削除して既存のgridviewのフッター部に入力後、クリックしましたが、やはり値は""です。試しに、新しいgridview2を使ってやってみましたが、結果は同じでした。なぜなんだろう・・・。
    2007年7月11日 5:20
  • その後、更にテストしていまして、trapemiyaさんの指摘どおりポストバックの問題でした。単に、Page_Loadイベントにpostbackをかけただけで出来ました。それが下記です。

     if (!Page.IsPostBack)   <==を追加しただけです・・・
            {
                DataTable table = new DataTable();
                table.Columns.Add("担当者", typeof(string));
                table.Columns.Add("ORDER NUM", typeof(int));
                table.Columns.Add("日付", typeof(string));

                DataRow row3 = table.NewRow();
                row3["日付"] = "Header";
                table.Rows.Add(row3);

                DataRow row = table.NewRow();
                row["担当者"] = "somebody";
                row["ORDER NUM"] = 200123;
                row["日付"] = "2007/07/05";
                table.Rows.Add(row);

                DataRow row2 = table.NewRow();
                row2["担当者"] = "somebody";
                row2["ORDER NUM"] = 200124;
                row2["日付"] = "2007/07/06";
                table.Rows.Add(row2);

                GridView1.DataSource = table;
                GridView1.DataBind();

    }

    この辺のポストバックの勉強がまだ足りませんね。お騒がせしました。。。

    2007年7月11日 5:56