2013-03-14 216 views
1

我试图删除一个GridView中的一行(数据还没有在数据库中),所以它应该是一个简单的删除行,如果有人可以请指点我在正确的方向... 。 这是我做了什么:GridView删除行

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

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

这是在GridView的样子:(使用一个LinkBut​​ton做删除)的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> 

类:

 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(); 
} 
+1

你能调试,并出示e.CommandArgument的价值? – 2013-03-14 07:12:41

+0

它打破了这个特定的行,如果我看看它只给这个值“”...有没有另一种方法来删除行? – Kerieks 2013-03-14 07:17:05

+0

您是否尝试过'GridView1.SelectedIndex'来获取已删除行的索引? – noobob 2013-03-14 07:30:50

回答

2

找到了解决办法,唯一需要做的一个数据绑定....这里是工作代码:

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(); 
    } 
+0

无需编写'GridView1。DeleteRow(index);'如果你将最后一个'ViewState [“DataTable”]''分配给你的Gridview。 – Chirag 2014-02-03 13:39:41

0

尝试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 
} 
+0

e .CommandArgument自从他创建该行后将始终为空。 – noobob 2013-03-14 07:32:30

+0

我正在显示正确的解析方式,实际问题出在别的地方,我已经提到 – TalentTuner 2013-03-14 07:33:22

+0

这种方法会得到另一个错误:“最好的重载方法匹配'int.TryParse(string,out int)'有一些无效参数”,我试图获得CommandArgument的原因是因为我需要获取rowindex ....我查看了互联网上的几个网站,发现这是最常用的删除行的方式....感谢也许只需要得到另一种获得索引的方法.... – Kerieks 2013-03-14 07:46:46

1

Seems like you didn't mention CommandArgument property in the GridView .

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

Add the CommandArgument as shown above.

+0

为GridView添加CommandArgument,但我仍然没有找回应该删除的rowindex .... – Kerieks 2013-03-14 07:50:15

1

试试这个..

在ASPX

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

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

索引返回为0。 ..该行仍然不会从gridview中删除..... – Kerieks 2013-03-14 07:58:24

+0

@ user2042152其中是要删除的数据?你不在gridview中绑定任何东西,那么我如何删除一行? – coder 2013-03-14 07:59:43

+0

当行被插入它绑定到gridview,将更新我的帖子为你看 – Kerieks 2013-03-14 08:10:34

0
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