如何在页面加载时使用下拉列表绑定gridview

时间:2013-07-22 13:52:12

标签: c# asp.net visual-studio-2010 gridview

我有一个按类别搜索的下拉列表。 我需要帮助在页面加载时绑定我的gridview,但同时,我还有一个select命令作为投票。 我知道在pageload事件中有代码如Databinding。但对于我的情况,我需要将select命令链接到一个按钮来更新投票。如果我数据绑定它,我无法获取数据键名称来更新我的投票计数器。 有没有办法绑定gridview,而不删除gridview本身的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#c​​ode

 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 { } 
}

2 个答案:

答案 0 :(得分:1)

您应该从GridView实现RowCommand事件。您已经拥有CommandField,所以请执行以下操作:

void GridView1_RowCommand(Object sender, GridViewCommandEventArgs e)
{
  //
  // Get the keys from the selected row
  //
  LinkButton lnkBtn = (LinkButton)e.CommandSource;    //the button
  GridViewRow myRow = (GridViewRow)lnkBtn.Parent.Parent;  //the row
  GridView myGrid = (GridView)sender; // the gridview
  int reviewid = Convert.ToInt32(GridView1.DataKeys[myRow.RowIndex].Value); //value of the datakey **strong text**

  // If multiple buttons are used in a GridView control, use the
  // CommandName property to determine which button was clicked.
  // In this case you are pressing the button Select, as ou already
  // defined this at the aspx code.
  if(e.CommandName=="Select")
  {
    // Put the logic from btnVote_Click here
  }
}

另一种方法是实现SelectIndexChangingSelectIndexChanged,因为您将使用“选择”按钮来激活更新魔法。这里是SelectIndexChanging的示例。

void GridView1_SelectedIndexChanging(Object sender, GridViewSelectEventArgs e)
{

  // Get the currently selected row. Because the SelectedIndexChanging event
  // occurs before the select operation in the GridView control, the
  // SelectedRow property cannot be used. Instead, use the Rows collection
  // and the NewSelectedIndex property of the e argument passed to this 
  // event handler.
  int reviewid = Convert.ToInt32(GridView1.DataKeys[e.NewSelectedIndex].Value); //value of the datakey **strong text**

  // Put the logic from btnVote_Click here
}

答案 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>

什么是Happenning:

  • 每次在下拉列表中选择一个值时,都会发生回发(AutoPostback =“true”)。
  • 在Page.PreRender事件之后,DataSource控件[此处的SqlDatSource]执行所需的查询并检索数据。因此,SqlDataSource将使用所选的DropDownList值。因此,无需担心以任何方式更改/操作DataSourceID。

2。)“但对于我的情况,我需要将select命令链接到按钮以更新投票”

在这种情况下,您在网格视图中有一个选择按钮,在GridView外部有一个“投票”按钮,但在页面的某个位置。因此,一旦在网格视图中选择任何行,请单击“投票”按钮。您可以照常访问SelectedRow和Index。

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

请注意,“投票”按钮的Click事件会在DataSource控件执行查询之前触发。检索数据。因此,一旦您在btnVote_click事件中更新投票计数,就像您当前所做的那样,无需再次绑定数据。这部分代码对我来说似乎很好。