1

カテゴリ別に検索するドロップダウン リストがあります。ページの読み込み時にグリッドビューをバインドするのに助けが必要ですが、同時に、投票として選択コマンドもあります。pageload イベントに Databinding などのコードがあることは知っています。しかし、私の場合、選択コマンドをボタンにリンクして投票を更新する必要があります。データバインドすると、データキー名を取得して投票カウンターを更新できませんでした。グリッドビュー自体の DataSourceID を削除せずに、グリッドビューをバインドする方法はありますか?

私のaspxコードは次のとおりです。

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                        ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
                        SelectCommand="SELECT * FROM [Review] WHERE ([Category] = @Category)">
                        <SelectParameters>
                            <asp:ControlParameter ControlID="ddlCat" Name="Category" 
                                PropertyName="SelectedValue" Type="String" />
                        </SelectParameters>
                    </asp:SqlDataSource>



                      <asp:SqlDataSource ID="SqlDataSource2" runat="server" 
                        ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
                        SelectCommand="SELECT [Category] FROM [ReviewCategory]">
                        </asp:SqlDataSource>


                    <asp:DropDownList ID="ddlCat" runat="server" 
                        DataSourceID="SqlDataSource2" DataTextField="Category" 
                        DataValueField="Category" AutoPostBack="True" 
                        onselectedindexchanged="SelectionChange">
                    </asp:DropDownList>


<asp:GridView ID="GridView1" runat="server" Width="1114px" 
    Height="272px" AutoGenerateColumns="False" PageSize="5" 
        DataSourceID="SqlDataSource1" AllowPaging="True" DataKeyNames="ReviewID">
<Columns>

    <asp:BoundField DataField="Votes" HeaderText="Votes" 
        SortExpression="Votes" />
    <asp:BoundField DataField="Category" HeaderText="Category" 
        SortExpression="Category" />

    <asp:CommandField SelectText="VOTE as your FAVOURITE!" 
        ShowSelectButton="True" />
</Columns>

c# コード

 protected void btnVote_Click(object sender, EventArgs e)
{
    int reviewid = Convert.ToInt16(GridView1.SelectedDataKey.Value);

    SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True");
    string sqlstmt = "select Votes from Review where ReviewID = '" + reviewid + "'";
    SqlCommand comm = new SqlCommand(sqlstmt, conn);


    try
    {

        conn.Open();
        SqlDataReader read = comm.ExecuteReader();


        if (read.Read())
        {
            int votes = (int)read["Votes"];
            votes += 1;
            string updatestatement = "Update Review set Votes= '" + votes + "' Where ReviewID = '" + reviewid + "'";
            SqlCommand command = new SqlCommand(updatestatement, conn);
           read.Close();
            command.ExecuteNonQuery();
        }


    }
    finally { 
        conn.Close();
        GridView1.DataBind();
    }

}

     protected void SelectionChange(object sender, EventArgs e)
  {

    int stored = ddlCat.SelectedIndex;

    if (stored == 0)
    {
        SqlDataSource1.SelectCommand = "SELECT * from Review ORDER BY [Votes] DESC  ";


    }
    else { } 
}
4

2 に答える 2

1

お客様の要件を 1 つずつ調べてみましょう。

1.) * DropDownList を使用して PageLoad で GridView をバインドします。

この場合、dropdownList で選択された値を取得する必要があります。以下の設定を行い、DropDownList から値を取得します

<asp:SqlDataSource ID="SqlDataSource2" runat="server" 
 ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
 SelectCommand="SELECT [Category] FROM [ReviewCategory] where Category=@Category">
<SelectParameters><asp:ControlParameter ControlID="ddlCat" Name="Category"
 PropertyName="SelectedValue" /></SelectParameters>
</asp:SqlDataSource>

何が起きているか:

  • ドロップダウンで値が選択されるたびに、ポストバックが発生します (AutoPostback="true")。
  • Page.PreRender イベントの後、DataSource コントロール [ここでは SqlDatSource] が必要なクエリを実行し、データを取得します。したがって、選択された DropDownList 値は SqlDataSource によって使用されます。したがって、DataSourceID の変更や操作について心配する必要はありません。

2.) 「しかし、私の場合、選択コマンドをボタンにリンクして投票を更新する必要があります」 '

この場合、グリッド ビューの内側に [選択] ボタンがあり、GridView の外側に「投票」ボタンがありますが、ページのどこかにあります。したがって、グリッド ビューで任意の行を選択したら、[投票] ボタンをクリックします。SelectedRow と Index には通常どおりアクセスできます。

protected void btnVote_Click1(object sender, EventArgs e)
{
     int i = CustomersGridView.SelectedIndex;
}

「投票」ボタンの Click イベントは、DataSource コントロールがクエリを実行してデータを取得する前に発生することに注意してください。したがって、現在行っているように btnVote_click イベントで投票数を更新すると、データを再度バインドする必要はありません。あなたのコードのこの部分は私には問題ないようです。

于 2013-07-22T17:24:10.980 に答える