質問者
GridView内のtextboxの値が取れないのですが

質問
-
どうしたらいいのでしょうか。まず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が取得)。
すべての返信
-
アドバイスありがとうございます。その後もテストとして、とにかくどこのイベントでもいいから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)
とにかく最初から値が取れていません。エラーにもならないのでどこかでリセットされているのでしょうがよくわかりません。
-
Visual Studioで開いていると削除できません。Visual Studioが掴んでいるからです。簡単に言えば、ASP.NETはtemporary asp.net filesにある当該フォルダにソースを動的に生成してコンパイルを行い、実行モジュールを生成しています。そこがおかしくなると生成されたソースの整合性が取れなくなり、おかしな動作をする場合があります。そこで、一度そこを全て削除することにより、1からソースを生成し直さすわけです。
さて、GridViewのFooterにTextBoxを追加して、その値を取得するだけの簡単なページを作成して、そこで動作を確認してみると、不具合の原因を切り分けられるのではないかと思います。
-
その後、更にテストしていまして、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();}
この辺のポストバックの勉強がまだ足りませんね。お騒がせしました。。。