0

選択クエリとグリッドビューに関連付けられた DDL を含む ASP ページがあります。pageLoad値を選択してグリッドビューに問題なく入力できるようになった後。

<asp:DropDownList ID="DropDownList3" runat="server" OnSelectedIndexChanged="DropDownList3_SelectedIndexChanged" AutoPostBack="True">
 <asp:ListItem>Select an entry</asp:ListItem>
 <asp:ListItem>Requested</asp:ListItem>
 <asp:ListItem>Requested and Closed</asp:ListItem>
 <asp:ListItem>Ordered</asp:ListItem>
 <asp:ListItem>Working</asp:ListItem> 
 <asp:ListItem>Warranty Parts</asp:ListItem> 
 <asp:ListItem>Warranty Service</asp:ListItem>
 <asp:ListItem>Filled</asp:ListItem>
</asp:DropDownList>

protected void DropDownList3_SelectedIndexChanged(object sender, EventArgs e)
{
    //string choice = DropDownList3.SelectedItem.Text;
    int index = DropDownList3.SelectedIndex;
    string query;
    switch (index)
    {
        case 0:
            {
                query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] ORDER BY [last_name]";
                break;
            }
        case 1:
            {
                query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WAIT-PR' ORDER BY [last_name]";
                break;
            }
        case 2:
            {
                query = "SELECT [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE ([zpart_used_completed] IS NULL) AND ([status]='WAIT-PR' OR [status]='CLO')  ORDER BY [last_name]";
                break;
            }
        case 3:
            {
                query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WAIT-PO' ORDER BY [last_name]";
                break;
            }
        case 4:
            {
                query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WORK' ORDER BY [last_name]";
                break;
            }
        case 5:
            {
                query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [status]='WAIT - WP' OR [status]='WAIT-W' ORDER BY [last_name]";
                break;
            }
        case 6:
            {
                query = "SELECT [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number] , [ref_num], [status], [summary], [id], (SELECT [DDvalue] FROM zpartStatuses WHERE [code] = [zpart_used_completed] ) AS [zpart_used_completed] FROM View_USS_ICG_Parts_Requested INNER JOIN zpartStatuses ON [zpart_used_completed] = zpartStatuses.code WHERE ([status] = 'WAIT - WS')ORDER BY [last_name]";
                break;
            }
        case 7:
            {
                query = "SELECT [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] WHERE [zpart_used_completed] = '1' ORDER BY [last_name]";
                //query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] ORDER BY [last_name]";
                break;
            }
        default:
            {
                query = "SELECT TOP 100 [last_name], [zpart_used_manual], [zpart_used_SN], [serial_number], [ref_num], [status], [summary], [id], [zpart_used_completed] FROM [VIEW_USS_ICG_Parts_Requested] ORDER BY [last_name]";
                break;
            }

    }
    SqlConnection sqlConnection = new SqlConnection(@"Data Source=XXX.XXX.XXX.XXX;Initial Catalog=mdb;Persist Security Info=True;User ID=user;Password=pass");
    SqlCommand sqlCommand = new SqlCommand(query, sqlConnection);
    sqlConnection.Open();
    SqlDataReader reader = sqlCommand.ExecuteReader();
    GridView1.DataSource = reader;
    GridView1.DataBind();

}

グリッドビュー内には、その行で更新クエリをトリガーする別の DDL を含むアイテム テンプレートがあります。

 <asp:DropDownList ID="DropDownList4" runat="server" DataSourceID="SqlDataSource1"
 DataTextField="DDvalue" DataValueField="code" Height="20px" Width="150px" 
 AutoPostBack="True" CommandName="DD4" OnSelectedIndexChanged = "DDL4_SelectedIndexChanged">
 </asp:DropDownList>        

protected void DDL4_SelectedIndexChanged(object sender, EventArgs e)
{
    string sqlQueryString2 = "UPDATE [act_log] SET [zpart_used_completed]= @status, [zpart_used_status] = @date  WHERE [id] = @id";
    SqlConnection sqlConnectionCmdString2 = new SqlConnection(@"Data Source=XXX.XXX.XXX.XXX;Initial Catalog=mdb;Persist Security Info=True;User ID=user;Password=pass");
    int status;
    GridViewRow gr = (GridViewRow)((DataControlFieldCell)((DropDownList)sender).Parent).Parent;
    DropDownList d4 = (DropDownList)gr.FindControl("DropDownList4");
    status = d4.SelectedIndex;
    string id = GridView1.Rows[gr.RowIndex].Cells[10].Text;             
    sqlConnectionCmdString2.Open();
    SqlCommand sqlQueryCmd2 = new SqlCommand(sqlQueryString2, sqlConnectionCmdString2);
    sqlQueryCmd2.Parameters.Add("@id", id);
    sqlQueryCmd2.Parameters.Add("@status", status);
    sqlQueryCmd2.Parameters.Add("@date", DateTime.Now.ToShortDateString());
    sqlQueryCmd2.ExecuteNonQuery();
    sqlQueryCmd2.Dispose();
    sqlConnectionCmdString2.Close();
    GridView1.DataBind();

}

両方の DDL が AutoPostBack 用に設定されています。問題は、OnSelectedIndexChangedイベントがトリップしたときDropDownList4にページが の結果に戻らないことですDropDownList3。代わりにページが引っ張っているのは次のとおりです。

 <EmptyDataTemplate>
 No records could be retrieved from the database.  We apologize for the invonvenience.
 </EmptyDataTemplate>

変更のたびにグリッドビューを更新するようにページを取得するにはどうすればよいですか?

4

1 に答える 1

0

このAutoPostBackプロパティはポストバックを引き起こします (明らかに)。から削除this.Databind();します!IsPostBack

if (!IsPostBack) {
    this.DataBind();
}

になります:

this.DataBind();

アップデート:

GridView で ViewState を有効にしていますか?

アップデート:

さて、問題が見えてきたと思います。のハンドラでDropDownList3_SelectedIndexChanged、次のように設定DataSourceGridView1ます。

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

その後、ポストバック ハンドラーで、別のデータ ソースを指定せずDDL4_SelectedIndexChangedに再バインドを試みます。GridView1

GridView1.DataBind();

(ASPX マークアップで) 宣言的GridView1に設定されていれば、これは問題になりません。DataSourceただし、DataSourceプロパティが動的に設定されている場合(分離コードで)、プロパティが自動的に永続化されることは決してないというのが私の経験です。

解決策は、Selectクエリを再実行してデータソースを再設定してから再バインドするか、手動でデータソースを永続化してから自由に再バインドできるようにすることです。

データソースを手動で永続化するには、通常、ViewState に保存する保護されたページ プロパティを使用します。

protected SqlDataReader GridView1DataSource {
    get {
        SqlDataReader reader = null;

        if (ViewState("SomeStringUniqueToThePageThatICanUseAsAKeyAndRemainsDescriptive") != null) {
            reader = ViewState("SomeStringUniqueToThePageThatICanUseAsAKeyAndRemainsDescriptive");
        }

        return reader;
    }
    set { ViewState("SomeStringUniqueToThePageThatICanUseAsAKeyAndRemainsDescriptive") = value; }
}

それで

  1. ページ プロパティを設定する

    this.GridView1DataSource = reader;

  2. データソースをページ プロパティに設定します

    GridView1.DataSource = this.GridView1DataSource;

  3. 必要なときにいつでも再バインドします

    GridView1.DataBind();

これらの手法の両方を使用できない理由はありませんが、実際にデータソースを更新する必要がある場合は、ページ プロパティで再永続化する前にクエリを再実行する必要があります。

これの反対側は、データソースを実際に更新する必要がない場合は、ポストバック ハンドラーGridViewでデータソースを再バインドする必要さえないかもしれないということです。DDL4_SelectedIndexChanged

于 2012-10-01T22:08:04.967 に答える