更新行单元格抛出范围异常
Updating row cells throwing out of range exception
我正在尝试更新网络表单应用程序中网格视图中的一行,但出现格式异常。我的其他存储过程正在运行,我已经根据此代码检查了这些存储过程,但找不到这个失败的地方。应用程序中的所有其他功能均正常运行。
感谢任何帮助,谢谢。
我的存储过程。
CREATE PROCEDURE UpdateProd
@pId int, @catId int,
@pname varchar(15),
@pdesc1 varchar(25), @pdesc2 varchar(50),
@pprice dec(8,2)
AS
UPDATE Prod
SET CatID = @catId,
PName = @pname,
PDesc1 = @pdesc1,
PDesc2 = @pdesc2,
Price = @pprice
WHERE ProdId = @pId;
GO
我的数据绑定等更新。
public static void UpdateProduct(string[] param1)
{
// SqlConnection.
SqlConnection con = new SqlConnection(conString);
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "UpdateProd";
cmd.Parameters.Add("@pId", SqlDbType.Int).Value = param1[0];
cmd.Parameters.Add("@catId", SqlDbType.Int).Value = param1[1];
cmd.Parameters.Add("@pname", SqlDbType.VarChar).Value = param1[2];
cmd.Parameters.Add("@pdesc1", SqlDbType.VarChar).Value = param1[3];
cmd.Parameters.Add("@pdesc2", SqlDbType.VarChar).Value = param1[4];
cmd.Parameters.Add("@pprice", SqlDbType.Decimal).Value = param1[5];
// etc .../
我更新行的方法。
protected void GVProducts_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = GVProducts.Rows[e.RowIndex];
string[] param = { row.Cells[1].Text.ToString(), row.Cells[2].Text.ToString(),
row.Cells[3].Text.ToString(), row.Cells[4].Text.ToString(), row.Cells[5].Text.ToString(),
row.Cells[6].Text.ToString() };
Login.UpdateProduct(param);
}
我对 GridView 列的标记
<Columns>
<asp:BoundField DataField="ProdID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
SortExpression="ProdID" />
<asp:BoundField DataField="CatID" HeaderText="Cat" SortExpression="CatID" />
<asp:BoundField DataField="PName" HeaderText="Product Name" SortExpression="PName" />
<asp:BoundField DataField="PDesc1" HeaderText="Short Product Description" SortExpression="PDesc1" />
<asp:BoundField DataField="PDesc2" HeaderText="Long Product Description" SortExpression="PDesc2" />
<asp:BoundField DataField="Price" HeaderText="Price" SortExpression="Price" />
</Columns>
我得到一个
System.FormatException
我将行单元格的索引从 1 开始,这在选择要删除的 prodId 时有效。我假设第一列(索引 0)被 [edit/select] 占用。我已经测试过在两个方向上更改索引,但这没有帮助。
编辑
实际行仅显示 Cells 索引 = 1。较大的索引抛出超出范围的异常。所以这很好奇。设置 gridview、re Cells 时有什么我需要知道的吗?
我要做的第一件事是停止构建和传递字符串数组。相反,我会传递每个参数。它更容易编码,更容易调试,并消除了很多歧义。您还可以指定数据类型,这可能是这里的问题。您正在传递字符串,然后希望它们可以隐式转换为 int。题外话,但我也建议将您的连接包装在 USING 中。
我正在尝试更新网络表单应用程序中网格视图中的一行,但出现格式异常。我的其他存储过程正在运行,我已经根据此代码检查了这些存储过程,但找不到这个失败的地方。应用程序中的所有其他功能均正常运行。
感谢任何帮助,谢谢。
我的存储过程。
CREATE PROCEDURE UpdateProd
@pId int, @catId int,
@pname varchar(15),
@pdesc1 varchar(25), @pdesc2 varchar(50),
@pprice dec(8,2)
AS
UPDATE Prod
SET CatID = @catId,
PName = @pname,
PDesc1 = @pdesc1,
PDesc2 = @pdesc2,
Price = @pprice
WHERE ProdId = @pId;
GO
我的数据绑定等更新。
public static void UpdateProduct(string[] param1)
{
// SqlConnection.
SqlConnection con = new SqlConnection(conString);
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "UpdateProd";
cmd.Parameters.Add("@pId", SqlDbType.Int).Value = param1[0];
cmd.Parameters.Add("@catId", SqlDbType.Int).Value = param1[1];
cmd.Parameters.Add("@pname", SqlDbType.VarChar).Value = param1[2];
cmd.Parameters.Add("@pdesc1", SqlDbType.VarChar).Value = param1[3];
cmd.Parameters.Add("@pdesc2", SqlDbType.VarChar).Value = param1[4];
cmd.Parameters.Add("@pprice", SqlDbType.Decimal).Value = param1[5];
// etc .../
我更新行的方法。
protected void GVProducts_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = GVProducts.Rows[e.RowIndex];
string[] param = { row.Cells[1].Text.ToString(), row.Cells[2].Text.ToString(),
row.Cells[3].Text.ToString(), row.Cells[4].Text.ToString(), row.Cells[5].Text.ToString(),
row.Cells[6].Text.ToString() };
Login.UpdateProduct(param);
}
我对 GridView 列的标记
<Columns>
<asp:BoundField DataField="ProdID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
SortExpression="ProdID" />
<asp:BoundField DataField="CatID" HeaderText="Cat" SortExpression="CatID" />
<asp:BoundField DataField="PName" HeaderText="Product Name" SortExpression="PName" />
<asp:BoundField DataField="PDesc1" HeaderText="Short Product Description" SortExpression="PDesc1" />
<asp:BoundField DataField="PDesc2" HeaderText="Long Product Description" SortExpression="PDesc2" />
<asp:BoundField DataField="Price" HeaderText="Price" SortExpression="Price" />
</Columns>
我得到一个
System.FormatException
我将行单元格的索引从 1 开始,这在选择要删除的 prodId 时有效。我假设第一列(索引 0)被 [edit/select] 占用。我已经测试过在两个方向上更改索引,但这没有帮助。
编辑
实际行仅显示 Cells 索引 = 1。较大的索引抛出超出范围的异常。所以这很好奇。设置 gridview、re Cells 时有什么我需要知道的吗?
我要做的第一件事是停止构建和传递字符串数组。相反,我会传递每个参数。它更容易编码,更容易调试,并消除了很多歧义。您还可以指定数据类型,这可能是这里的问题。您正在传递字符串,然后希望它们可以隐式转换为 int。题外话,但我也建议将您的连接包装在 USING 中。