2

これが私のaspxコードです:

<EditItemTemplate>
   <asp:DropDownList ID="ddlTotalColumn" runat="server">
       <asp:ListItem Value="">Select value</asp:ListItem>
       <asp:ListItem Value="0">1</asp:ListItem>
       <asp:ListItem Value="1">2</asp:ListItem>
   </asp:DropDownList>
</EditItemTemplate>

私のaspx.csコード:

protected void gvTest_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    GridViewRow selected_row = gvTest.Rows[e.RowIndex];

    var total_column_drop_down_list = (DropDownList)selected_row.FindControl("ddlTotalColumn");

    int column_string = Convert.ToInt32(total_column_drop_down_list.SelectedItem.Value);

    gvTest.EditIndex = -1;
    ...
}

この行: int column_string = Convert.ToInt32(total_column_drop_down_list.SelectedItem.Value); 「total_column_drop_down_list.SelectedItem.Value」は空の文字列 ("") を返すため、「入力文字列の形式が正しくありません」というエラーが表示されます。

それで、何か素晴らしいアイデアはありますか?

4

1 に答える 1

4

データバインディング コードをif (!Page.IsPostBack)ブロック内に配置しないという古典的な間違いを犯したようです。したがって、GridView が再バインドされ、RowUpdating イベントで (選択したものではなく) デフォルト値が取得されます。

たとえば、Page_Load で GridView をバインドしている場合は、次のようにする必要があります。

if (!Page.IsPostBack)
{
    BindGrid();
}

「BindGrid()」は、GridView をデータバインドするために呼び出すコードです。


少し関係がありませんが、実際には、そのメソッドに渡されるGridViewUpdateEventArgsパラメーターを使用して、更新された値を取得できます (FindControl を使用して DropDownList を取得してから値を取得するのではなく)。

于 2013-08-14T15:17:33.397 に答える