0

プロパティを持つGridViewがあります:

OnRowUpdating="GridViewRowUpdateEventHandler"

GridView 内には、次のコントロールがあります。

<asp:TemplateField HeaderText="Progress" SortExpression="progress">
    <ItemTemplate>
        <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true">
            <asp:ListItem Value="0">Incomplete</asp:ListItem>
            <asp:ListItem Value="1">Complete</asp:ListItem>
        </asp:DropDownList>
    </ItemTemplate>
</asp:TemplateField> 

は次のGridViewRowUpdateEventHandlerようになります。

protected void GridViewRowUpdateEventHandler(object sender, GridViewUpdateEventArgs e)
{
    SqlConnection connection;
    SqlCommand command;

    GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];

    DropDownList ddlPriority = (DropDownList)row.FindControl("DropDownList1");

    using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {
        using (command = new SqlCommand(@"update table1 set priority = @priority where id = @id", connection))
        {
            command.Parameters.Add("@priority", SqlDbType.Int, 1).Value = ddlPriority.SelectedValue;
            command.Parameters.Add("@id", SqlDbType.Int, 1).Value = row.RowIndex;

            connection.Open();
            command.ExecuteNonQuery();
            connection.Close();
        }
    }

    GridView1.DataBind();
}

エラー メッセージがまったく表示されず、データベース内の関連する行が更新されていません。理由を知っている人はいますか?

間違ったセルを見ているのCells[5]でしょうか? それとも、page_load に何もないからでしょうか? それとも何か他のものですか?

4

4 に答える 4

1

問題は、行のrowIndexをIDとして使用していることだと思います。したがって、最後のSQLコマンドは次のようになります

update table1 set priority = 'blah' where id = 0 //(where its the first row and so on)

したがって、これは完全に適切なクエリであり、エラーや例外なしで実行されますが、ID = 0 はありません。間違った ID にバインドしています。バインドする必要があるのは、テーブルの ID です。

これは、SQL プロファイラーを実行することで再確認でき、データベースに送信されているクエリを見つけることができるはずです。

于 2012-09-01T00:02:22.617 に答える
1

DataBindGridViewRowUpdateEventHandler の最後に追加 します

GridView.DataBind();

コントロールを見つけるために

var ddlPriority = (DropDownList)row.FindControl("DropDownList1");
于 2012-08-31T15:15:13.807 に答える
1

gridView データを再バインドするのを忘れていると思います

gridview1.DataSource = YOUR_DATASOURCE;
gridview1.DataBind();

さらに、あなたのdropDownListにアクセスする必要があります

DropDownList ddlPriority = (DropDownList) row.FindControl("DropDownList1");

編集

別のエラーが見つかりました

command.Parameters.Add("@id", SqlDbType.Int, 1).Value = row; // wrong! primaryKey value needed!

行は GridViewRow 型であるため、これは機能しません。primaryKey 値を割り当てる必要があります。

最初に何をしようと決めたとしてもDebug.WriteLine(..)、SQL Server に送信される値を確認するステートメントをいくつか追加します。

于 2012-08-31T15:15:29.920 に答える
1

DropDiownList は a にTemplateFieldあり、それNamingContainerは GridViewRow であるrow.FindControlため、参照を取得するために使用する必要があります。

DropDownList ddlPriority = (DropDownList)row.FindControl("DropDownList1");

それ以外の

DropDownList ddlPriority = (DropDownList)row.Cells[5].FindControl("DropDownList1");

しかし、それはあなたの問題の核心ではありません.6row.Cells[5].FindControl番目のセルにある場合にも機能する可能性があります. そうしないと、NullreferenceException.

ポストバックで GridView もバインドしていると思います。IsPostBackプロパティを確認する必要があります。

protected void Page_Load()
{
    if (!IsPostBack)
    {
        BindGrid();
    }
}

それとは別に:

command.Parameters.Add("@id", SqlDbType.Int, 1).Value = row;

rowGridViewRow であるため、機能しません。最後に GridViewも必要ですDataBind。そうしないと、変更が反映されません。

于 2012-08-31T15:15:05.070 に答える