在GridView中的特定行上单击“编辑”按钮时,禁用所有行上的“编辑”按钮

时间:2011-09-16 19:05:51

标签: asp.net

我在GridView的每一行都有一个带有5列的gridView,其中包含Edit和Delete按钮。单击一个特定行的编辑按钮后,我想禁用其余行上的编辑和删除按钮。

下面是我的aspx

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" ShowFooter="True" EnableModelValidation="True"          onrowdatabound="GridView1_RowDataBound" onrowcommand="GridView1_RowCommand" onrowdeleting="GridView1_RowDeleting" EditRowStyle-ForeColor="Aqua"  onrowediting="GridView1_RowEditing" >

<asp:TemplateField HeaderText="Item#" >
<ItemTemplate>
<asp:Label ID="Item#" runat="server" Text='Label' ></asp:Label>
</ItemTemplate>
  </asp:TemplateField>

      ..........  

  <asp:TemplateField >
<ItemTemplate>
<asp:Button ID="btnEdit" runat="server" CausesValidation ="false" Font-Size="Smaller" CommandName="Edit" Text="Edit" CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>' Width="35px"/>
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField >
<ItemTemplate> 
 <asp:Button ID="btnDelete" runat="server" CssClass="GridButton" CausesValidation="False" CommandName="Delete" Font-Size="Smaller" Text="Delete" CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>

   protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
     if (e.CommandName == "Delete")
            {
                int x = Convert.ToInt32(e.CommandArgument.ToString());
                txtLineItemNumber.Text = (x + 1).ToString();
            }
            else
            {

               int x = Convert.ToInt32(e.CommandArgument.ToString());
               foreach (GridViewRow row in GridView1.Rows)
                {
                    if (row.RowIndex != x)
                    {
                        Button editButton = (Button)row.FindControl("btnEdit");
                        editButton.Enabled = false;
                        Button deleteButton = (Button)row.FindControl("btnDelete");
                        deleteButton.Enabled = false;
                    }
                    else
                    {
                        Button deleteButton = (Button)row.FindControl("btnDelete");
                        deleteButton.Text = "Cancel";
                        e.CommandName = "Cancel"; --- This is not possible...what should I do so that the Command Name is changed to Cancel and it does the cancel operation.
                    }

                }                 }
      }

请帮助我让它工作.....

2 个答案:

答案 0 :(得分:1)

您正在采取的方法将正常工作。但是,在标记CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>'中设置的CommandArgument不是对Button本身的引用,而是Button所在的GridView行的索引。

您需要从RowCommand事件中的CommandArgument中检索索引,然后启用/禁用其他行上的所有按钮,如下所示:

void gridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    switch (e.CommandName.ToLower())
    {
        case "edit":
            {
                int rowIndex = Convert.ToInt32(e.CommandArgument);

                foreach (GridViewRow row in gridView1.Rows)
                {
                    if (row.RowIndex != rowIndex)
                    {
                        Button editButton = (Button)row.FindControl("btnEdit");
                        editButton.Enabled = false;
                        Button deleteButton = (Button)row.FindControl("btnDelete");
                        deleteButton.Enabled = false;
                    }
                }
            }break;
    }
}

修改(根据评论)

尝试将修改删除按钮的代码移动到RowEditing事件处理程序,如下所示:

void gridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    gridView1.EditIndex = e.NewEditIndex;

    DataBind();

    Button deleteButton = (Button)gridView1.Rows[e.NewEditIndex].FindControl("btnDelete");
    deleteButton.Text = "Cancel";
    deleteButton.CommandName = "Cancel";
}

void gridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    gridView1.EditIndex = -1;

    DataBind();
}

希望这有帮助。

答案 1 :(得分:0)

您可以使用此处概述的javascript http://www.krissteele.net/blogdetails.aspx?id=92。添加逻辑以禁用当前行。