【问题标题】:GridView Delete RowGridView 删除行
【发布时间】:2013-03-02 10:41:26
【问题描述】:

我正在尝试删除gridview中的一行(数据还没有在数据库中),所以它应该是一个简单的删除行,如果有人可以请指出我正确的方向...... 这就是我所做的:

     else if (e.CommandName == "DeletePart")
    {
        int index = Convert.ToInt32(e.CommandArgument); //#1 line
        GridView1.DeleteRow(index);  //#2 line
    }

我收到的错误是:“输入字符串的格式不正确。” (这发生在 #1 行)...

这是 gridview 的样子:(使用链接按钮进行删除)

    <asp:GridView ID="GridView1" runat="server"  AllowPaging="True" 
                                EmptyDataText="No parts has been added to the model, please add a part."
                                BorderColor="Black" BorderStyle="Solid"  BorderWidth="2px" 
                                CellPadding="3" onrowcommand="GridView1_RowCommand" 
                            onrowediting="GridView1_RowEditing" onrowdeleting="GridView1_RowDeleting">
                                <Columns>
                                <asp:TemplateField HeaderText="">
                                 <ItemTemplate>
                                   <asp:LinkButton ID="EditButton" runat="server" CssClass="EditButton" CommandName="Edit" Text="Edit" />
                                 </ItemTemplate>
                                 </asp:TemplateField>
                                 <asp:TemplateField HeaderText="">
                                 <ItemTemplate>
                                   <asp:LinkButton ID="DeleteButton" runat="server" CssClass="DeleteButton" CommandName="DeletePart" CommandArgument='<%# Container.DataItemIndex %>' Text="Delete" />
                                 </ItemTemplate>
                                 </asp:TemplateField>
                                </Columns>
                            <HeaderStyle BackColor="#FFFFCC"  BorderColor="Black" BorderStyle="Solid" 
                                BorderWidth="2px" />
                        </asp:GridView>

gridview 如何填充和绑定的类:

     public int companyID = 0;
public int methodID = 0;
DataTable dt;
#region SQLConnections

string connectionString = ConfigurationManager.ConnectionStrings["SOSConnectionString"].ConnectionString;
SqlConnection conn;
#endregion

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        dt = new DataTable();
        MakeDataTable();
        EmptyDataString();
    }
    else
    {
        dt = (DataTable)ViewState["DataTable"];
    }
    ViewState["DataTable"] = dt; 

}

#region GridView

private void EmptyDataString()
{
    TemplateBuilder tmpEmptyDataTemplate = new TemplateBuilder();
    tmpEmptyDataTemplate.AppendLiteralString("No parts has been added to the model, please add a part.");
    GridView1.EmptyDataTemplate = tmpEmptyDataTemplate;
    GridView1.DataBind();
}

private void MakeDataTable()
{
    dt.Columns.Add("Item");
    dt.Columns.Add("Quantity");
    dt.Columns.Add("Price P/Quantity");
}

private void AddToDataTable()
{
    DataRow dr = dt.NewRow();
    dr["Item"] = txtPart.Text;
    dr["Quantity"] = numQuantity.Text;
    dr["Price P/Quantity"] = txtPricePQ.Text;
    dt.Rows.Add(dr);
}

private void BindGrid()
{
    GridView1.DataSource = dt;
    GridView1.DataBind();
}

protected void btnAddPart_Click(object sender, EventArgs e)
{
    AddToDataTable();
    BindGrid();
    ClearNewParts();
}
#endregion

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Edit")
    { 
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            GridViewRow row = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer);
            txtPart.Text = row.Cells[2].Text;
            numQuantity.Text = row.Cells[3].Text;
            txtPricePQ.Text = row.Cells[4].Text;
        }
    }
    else if (e.CommandName == "DeletePart")
    {
        //int iCount = GridView1.Rows.Count;
        //for (int i = 1; i <= iCount; i++)
        //{
        //    GridView1.DeleteRow(i);
        //}
      //  int rowIndex = Convert.ToInt32(GridView1.SelectedRow);

        int index = Convert.ToInt32(e.CommandArgument);
        GridView1.DeleteRow(index);

        //int index = Convert.ToInt32(e.CommandArgument);
        //GridView1.DeleteRow(rowIndex);
    }


    GridView1.DataBind();
}

【问题讨论】:

  • 能否调试一下并显示 e.CommandArgument 的值?
  • 它在特定的行上中断,如果我查看它只给出这个“”的值......还有其他方法可以删除一行吗?
  • 你试过GridView1.SelectedIndex获取被删除行的索引吗?
  • @user2042152 数据绑定在哪里..

标签: c# gridview datatable


【解决方案1】:

找到了解决方案,只需要做一个数据绑定......这是工作代码:

    else if (e.CommandName == "Delete")
    {     
        int index = Convert.ToInt32(e.CommandArgument);
        GridView1.DeleteRow(index);
        ((DataTable)ViewState["DataTable"]).Rows[index].Delete();
        ((DataTable)ViewState["DataTable"]).AcceptChanges();
        GridView1.DataSource = (DataTable)ViewState["Data"];
        GridView1.DataBind();
    }

【讨论】:

  • 如果您将最终的ViewState["DataTable"]' 分配给您的Gridview,则无需编写GridView1.DeleteRow(index);
【解决方案2】:

您似乎没有在GridView 中提及CommandArgument 属性。

<asp:GridView runat="server" ID="gv" 
              CommandName="DeletePart" 
              CommandArgument='<%# Container.DataItemIndex %>'>         
</asp:GridView>

如上所示添加CommandArgument

【讨论】:

  • 添加CommandArgument适用于gridview,但我仍然没有找回应该被删除的rowindex....
【解决方案3】:

试试这个..

在 ASPX 中

<asp:GridView runat="server" ID="Gridview1" CommandName="delete" CommandArgument='<%#Container.DataItem.Index %>'/>

Cs

else if (e.CommandName == "DeletePart")
{
    int index = Convert.ToInt32(e.CommandArgument); 
    GridView1.DeleteRow(index);
}

【讨论】:

  • 索引返回为0...该行仍然没有从gridview中删除.....
  • @user2042152 要删除的数据在哪里?你没有在gridview中绑定任何东西那么你怎么能删除一行?
  • 当行被插入时它被绑定到gridview,会更新我的帖子给你看
  • 我无法获取此 Container.DataItem.Index。
【解决方案4】:

尝试 int.TryParse ,这将解决输入字符串 fromat 的问题,但是为什么会出现您需要检查您正在设置的 CommandArgument 的情况。

else if (e.CommandName == "DeletePart")
{
    int index =-1;
    if(int.TryParse(e.CommandArgument,out index)) //#1 line
        GridView1.DeleteRow(index);  //#2 line
}

【讨论】:

  • e.CommandArgument 将始终为空,因为他刚刚创建了行。
  • 我展示了正确的解析方式,实际问题出在我已经提到的其他地方
  • 此方法出现另一个错误:“'int.TryParse(string, out int)' 的最佳重载方法匹配有一些无效参数”,我试图获取 CommandArgument 的原因是因为我需要获取rowindex....我查看了互联网上的一些站点,发现这是删除行最常用的方法....谢谢,也许只需要另一种获取索引的方法。 ...
【解决方案5】:
Thy This:) 

<asp:GridView ID="GridView1" runat="server"  CssClass="gridview"
                            HorizontalAlign="Left" PagerSettings-Visible="true" AllowPaging="True" 
                            PageSize ="5" Width="300px" >
                            <Columns>
                               <asp:CommandField ShowDeleteButton="True" ButtonType="Button" />      
                            </Columns>
                            </asp:GridView>

then code behinde:


    Protected Sub GridView1_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView1.RowDeleting
        DirectCast(ViewState("CurrentDataReference"), DataTable).Rows.RemoveAt(e.RowIndex)
        GridView1.DataSource = DirectCast(ViewState("CurrentDataReference"), DataTable)
        GridView1.DataBind()

    End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多