2014-01-30 90 views
1

创建未在Gridview中更新其职位的用户列表。我希望列表中的下拉列表中包含所有可能的标题选择和下拉列表旁边的按钮。然后,一个人可以进入并更改下拉菜单中的标题,点击该按钮并更新并从列表中删除。获取Gridview中Dropdownlist的选定值

我有这样的方式,我希望它看起来,但我想弄清楚如何将该行中的下拉框的SelectedValue传递给OnClick后面的代码。正如你在下面看到的,我能得到的最接近的是传递CommandArgument中的行号。任何建议如何我可以将该特定行的下拉列表中的SelectedValue获取到OnClick?

编辑:也许我应该使用OnRowCommand而不是OnClick?

貌似这个目前:

John Doe | DropdownList Button 
Jane Doe | DropdownList Button 
Joe Doe | DropdownList Button 
Jeff Doe | DropdownList Button 

ASPX

<asp:GridView runat="server" ID="TitleView" OnRowDataBound="TitleView_RowDataBound" AutoGenerateColumns="False"> 
       <Columns> 
        <asp:BoundField DataField="Fullname" HeaderText="Fullname" /> 
        <asp:TemplateField> 
         <ItemTemplate> 
          <div class="input-append"><asp:DropDownList CssClass="span5" ID="TitleList" runat="server"> 
          </asp:DropDownList> 
           <asp:Button ID="lbnView" runat="server" Text="Update" CssClass="btn btn-primary" OnClick="btn_Clicked" 
              CommandArgument='<%# ((GridViewRow)Container).RowIndex %>'></asp:Button></div> 
         </ItemTemplate> 
        </asp:TemplateField> 
       </Columns> 
</asp:GridView> 

代码隐藏

public void bindTitleView() 
    { 
     using (SqlConnection conn = new SqlConnection("")) 
     { 
      SqlCommand cmd = new SqlCommand(@"SELECT U.First + ' ' + U.Last as Fullname, U.UserID, T.Name FROM Employees U LEFT JOIN Titles T ON U.Title = T.ID WHERE U.Active = '1' AND U.Title = '92' ORDER BY Fullname ASC", conn); 
      conn.Open(); 
      SqlDataAdapter adp = new SqlDataAdapter(cmd); 
      DataSet myDataSet = new DataSet(); 
      adp.Fill(myDataSet); 
      TitleView.DataSource = myDataSet; 
      TitleView.DataBind(); 
     } 
    } 
    protected void TitleView_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      DropDownList ddl = (DropDownList)e.Row.FindControl("TitleList"); 
      using (SqlConnection conn = new SqlConnection("")) 
      { 
       SqlCommand cmd = new SqlCommand(@"SELECT ID, Name FROM Titles ORDER BY Name ASC", conn); 
       conn.Open(); 
       SqlDataAdapter adp = new SqlDataAdapter(cmd); 
       DataTable myDataSet = new DataTable(); 
       adp.Fill(myDataSet); 
       ddl.DataSource = myDataSet; 
       ddl.DataTextField = "Name"; 
       ddl.DataValueField = "ID"; 
       ddl.DataBind(); 
      } 
     } 
    } 
    protected void btn_Clicked(object sender, EventArgs e) 
    { 
       String rowid = ((Button)sender).CommandArgument; 
    } 

SOLUTION:我批准了以下工作对我来说,一旦我加入的IsPostBack答案!到Page_Load

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      bindTitleView(); 
     } 

回答

1

你可以做这样的:

protected void btn_Clicked(object sender, EventArgs e) 
{ 
    int line = ((GridViewRow)((Button)sender).Parent.Parent).RowIndex; 
    DropDownList drp = ((DropDownList)TitleView.Rows[line].FindControl("TitleList")); 
    //Continue the method 
} 
+1

当我尝试这个,我得到2作为结果,每次不管我在下拉框中选择。 2恰好是下拉框中的第一个值,但即使我选择了不同的选择,该值始终为2.任何想法? – techora

+1

想象出来,当我绑定bindTitleView()时,我在Page_Load中忽略了if(!IsPostBack)。哎呀!感谢您的帮助。 – techora

+0

@kcray我也这么做。大声笑!很高兴帮助你! –

1

在你btn_click写代码如下

protected void btn_Clicked(object sender, EventArgs e) 
{ 

    Button Sample = sender as Button; 
    GridViewRow row = Sample.NamingContainer as GridViewRow; 
    DropDownList drp = row.FindControl("TitleList") as DropDownList; 
    //Now use drp.SelectedValue 
    } 
} 

让我知道如果这个心不是你所期待的。

相关问题