2013-07-24 63 views
0

我有一个GridView的按钮“删除”。 我需要获得值或索引的单元格[3]。 但与GridView1.SelectedRow.Cells[3].Text;它返回null。 有人帮我吗?我不想使用JavaScript。获取列值GridView

我的aspx:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" GridLines="None" 
     CssClass="table table-bordered table-striped"> 
     <Columns> 
      <asp:BoundField DataField="DisplayName" HeaderText="Display Name" /> 
      <asp:BoundField DataField="UserName" HeaderText="User Name" /> 
      <asp:BoundField DataField="Email" HeaderText="Email" /> 
      <asp:BoundField DataField="Name" HeaderText="Name" /> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:Button ID="btnDelete" runat="server" Text="Delete" OnClick="btnDelete_OnClick" /> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

我的.cs:

protected void btnDelete_OnClick(object sender, EventArgs e) 
{ 
    using (objConexao = new SqlConnection(strStringConexao)) 
    { 
     SqlConnection oConn = new SqlConnection(); 
     SqlCommand oCommand = new SqlCommand(); 
     string strConn = ConfigurationManager.ConnectionStrings["XXX"].ConnectionString; 
     oConn.ConnectionString = strConn; 
     oCommand.Connection = oConn; 
     oCommand.CommandText = "proc_Delete"; 
     oCommand.CommandType = CommandType.StoredProcedure; 

     SqlParameter myParam = oCommand.Parameters.Add("@UserRequestor", SqlDbType.NVarChar); 
     myParam.Value = User; 

     SqlParameter myParam2 = oCommand.Parameters.Add("@UserName", SqlDbType.NVarChar); 
     myParam2.Value = GridView1.Columns[3].ToString(); 

     oConn.Open(); 
     oCommand.ExecuteNonQuery(); 
     oConn.Close(); 
    } 
} 
+0

是你从你的'btnDelete_OnClick'方法提供的.cs代码? – wlyles

+0

是的!我添加了这些信息。 – CaioVJesus89

+0

尝试使用'e.Item.FindControl(“controlname”);'查找控件/单元格 – PiLHA

回答

2

试试这个:

protected void btnDelete_OnClick(object sender, EventArgs e) 
{ 
    Button btn = (Button)sender; 
    GridViewRow row = (GridViewRow)btn.NamingContainer 
    string desiredText = row.Cells[3].Text; 
    using (objConexao = new SqlConnection(strStringConexao)) 
    { 
     // ... 
     myParam2.Value = desiredText; 
     // ... 
    }   
} 

NamingContainer会得到你所点击Button的行

我不认为SelectedRow属性起作用,因为单击按钮不构成选择行。这是通过CommandName="Select"上的一个按钮完成的,或者在GridView上用AutoGenerateSelectButton="true"完成。 This question提供了一个解释。

+0

@ CaioVJesus89对不起,我误解了你的问题。查看我的编辑 – wlyles

+0

现在,它的工作原理! Tks,Wlyles! – CaioVJesus89

+0

@ CaioVJesus89我添加了一些信息来帮助您理解为什么您的原始代码不起作用 – wlyles

0

这是一段时间,但我知道你可以使用datakeynames这个。

在标记添加您要访问

<asp:GridView ID="GridView1" DataKeyNames="Email" runat="server" AutoGenerateColumns="false" GridLines="None" 
    CssClass="table table-bordered table-striped"> 

那么你应该能够得到与该行指数为这样的价值任何价值的关键。

GridView1.DataKeys[3].Value.ToString() 

这已经有一段时间了,所以你可能要玩这个。

Here's an article with more information, and how to have more than one datakey

+0

发生错误“索引超出范围必须为非负值且小于集合的大小 参数名称:索引“ – CaioVJesus89

+0

我刚刚测试了代码,我发布的内容是正确的。所以你的问题在别处。代码命中时您需要进行调试。 GridView1.DataKeys数组是否为空?网格是否填充?这是在ajax回发期间吗?数据键是否正确?主要是,你必须确保网格中有行,并且datakey数组不是空的。 – Smeegs