如何获取我用按钮单击的行

How do I get the row I clicked with a button

我有一个网格视图,当我单击按钮时,我想执行 SQL 命令以查看按下了哪个订单号。如何获取我点击的行?

asp

<asp:GridView ID="GridView1" runat="server" 
          DataKeyNames="No_" AutoGenerateColumns="false"  style="color:Black;border-collapse:collapse;margin-right: auto;display: table;text-align: center;" OnPageIndexChanging="MyGrid_PageIndexChanging" OnRowDataBound="MyGrid_RowDataBound" AllowPaging="True"  PageSize="20" AllowCustomPaging="False" >

        <Columns>
           <asp:BoundField DataField="No_" HeaderText="No_Encomenda"  />
           <asp:BoundField DataField="[Item No_]" HeaderText="Item number"  />
           <asp:BoundField DataField="Quantity" HeaderText="Quantity"  />

                        <asp:TemplateField HeaderText="Select">
                <ItemTemplate>
                    <asp:CheckBox ID="CheckBox1" runat="server" OnCheckedChanged="CheckBox1_CheckedChanged" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
             <PagerSettings Mode="NumericFirstLast" PageButtonCount="4" FirstPageText="First" LastPageText="Last"/>  
             <PagerStyle CssClass="gridview"  HorizontalAlign="Center" VerticalAlign="Middle"/>
      </asp:GridView>

cs

protected void ButtonDetails_Click(object sender, EventArgs e)
        {
            MyGrid.Visible = false;
            GridView1.Visible = true;
        }

网格视图图像:

嗯,首先,在您的标记中,我没有在您的标记中看到按钮。所以你的图片和标记不一致。

大约有 3 种通过按钮点击行的好方法。

最常见:

放入按钮。像这样说:

  <asp:TemplateField HeaderText="View">
     <ItemTemplate>
        <asp:Button ID="cmdView" runat="server" Text="Details" CommandName="Select" />
     </ItemTemplate>
  </asp:TemplateField>

注意我们是如何添加 CommandName = "select" 的。这是一个特殊选项,将触发 Gridivew RowIndexed 更改。它还会触发行命令。但是,在行命令中,“selected 行事件”尚未触发。所以,我只是忽略行命令事件,并将您的代码放在 selected 索引更改事件中。

  protected void MyGrid_SelectedIndexChanged(object sender, EventArgs e)
    {

            // Get selected row
            GridViewRow dG = MyGrid.SelectedRow;
            Response.Write("Row index was " + dG.RowIndex.ToString());

            // get non templated columns - they appear in cells
            Response.Write("2nd colum value = " + dG.Cells[1].Text);

            // get templated fields - say a combo box for city
            DropDownList CityComboBox = (DropDownList)dG.FindControl("DropDownList1");
            Response.Write("City selected from combo box = " + CityComboBox.SelectedValue);



        }

因此,只要添加 CommandName = "Select",就会触发 SelectedinddexChanged 事件。

另一种方法是使用行命令(但您必须将行索引传递给该事件)。

但是,一个真正巧妙的方法是 100% 忽略网格事件,只使用您的按钮。

你可以这样做:

放入按钮。但是现在你不能双击按钮来连接点击事件,但是你仍然可以为点击设置事件。

在标记中,您可以输入 OnClick= 注意非常小心弹出的 intli-sense - 它看起来像这样:

所以在上面的选择中 - 选择创建新事件 - 它看起来好像什么都没发生,但是当你翻回 code-behind 时,你有一个很好的简单干净,很好的旧常规按钮点击事件。

放置一个按钮 - 创建点击事件。您现在可以 100% 忽略复杂的 GridView 事件(以及 select 命令等)。

你现在这样做:

  protected void Button3_Click(object sender, EventArgs e)
    {

        Button MyButton = (Button)sender;
        GridViewRow dG = (GridViewRow)MyButton.Parent.Parent;


        Response.Write("Row index was " + dG.RowIndex.ToString());

        // get non templated columns - they appear in cells
        Response.Write("2nd colum value = " + dG.Cells[1].Text);

        // get templated fields - say a combo box for city
        DropDownList CityComboBox = (DropDownList)dG.FindControl("DropDownList1");
        Response.Write("City selected from combo box = " + CityComboBox.SelectedValue);
    }

我发现上面的方法不那么麻烦,而且使用起来也更容易学习。我们放入一个按钮 - 单击事件。你只要把“发件人”捡起来变成一个按钮,然后得到parent.parent,结果就是我们想要的网格行。

第一个 parent 我认为是一些细胞分隔器。事实上,我一直都在使用这个 .parent 技巧。因此按钮是放入网格标记中的简单按钮,我们使用标准按钮单击事件和代码方法。

但是,嘿,我们真的不关心 GridVieew 行命令,我们真的不关心 Selected 索引改变了。

我们有一个按钮点击。所以现在您可以使用这个巧妙的技巧来拯救世界贫困,使用复杂的 GridView 事件来拯救世界,并且只需像其他按钮一样编写一个简单的按钮。

我们通过这个技巧充分利用了网格视图行。