标题:DataGridView在刪除最后一筆記錄時拋出异常
取消只看楼主
C_B_Lu
Rank: 1
等 级:新手上路
威 望:1
帖 子:453
专家分:0
注 册:2006-1-10
 问题点数:0 回复次数:3 
DataGridView在刪除最后一筆記錄時拋出异常

我有一個dgv控件﹐它的數据源是一個BindingSource控件(bsPartList)﹐當我刪除最后一行時﹐會拋出异常(如下圖)﹐我跟蹤刪除代碼﹐發現最后一行刪除完成后﹐其dgv.Rows.Count的值為1,而bsPartList.Count的值為0.(但是當表中有多行記錄時﹐刪除完成后﹐這兩個值是一樣的)﹐為會么為這樣子﹖

具体刪除代碼如下﹒
private void tsbDelete_Click(object sender, EventArgs e)
{
if (dgvPartList.Rows.Count == 0)
{
MessageBox.Show("沒有可刪除的記錄!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
dgvPartList.Rows[bsPartList.Position].Selected = true;
string strPartID = dgvPartList.CurrentRow.Cells["colPartID"].Value.ToString().Trim();
if (MessageBox.Show("您确定要刪除物料編號為\" " + strPartID + " \"的記錄嗎﹖", "詢問", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
== DialogResult.Yes)
{
SqlCommand cmd = new SqlCommand("Part_Delete", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@partID", SqlDbType.NVarChar, 18);
cmd.Parameters["@partID"].Value = strPartID;
cmd.Parameters.Add("@errorMsg", SqlDbType.NVarChar, 200);
cmd.Parameters["@errorMsg"].Direction = ParameterDirection.Output;
if (conn.State != ConnectionState.Open)
{
conn.Open();
}
try
{
bsPartList.EndEdit();
cmd.ExecuteNonQuery();
bsPartList.RemoveCurrent();
bsPartList.EndEdit();
}
catch
{
string strMsg = cmd.Parameters["@errorMsg"].Value.ToString();
MessageBox.Show(strMsg, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
if (conn.State != ConnectionState.Closed)
{
conn.Close();
}
}
}
}


搜索更多相关主题的帖子: DataGridView 
2007-08-29 10:36
C_B_Lu
Rank: 1
等 级:新手上路
威 望:1
帖 子:453
专家分:0
注 册:2006-1-10
得分:0 
但是﹐如果先退出﹐再重新打開表單﹐這里刪除就不會有錯誤差

帮助那些真正需要帮助的人,是对帮助你的人最好的回报!
2007-08-29 11:32
C_B_Lu
Rank: 1
等 级:新手上路
威 望:1
帖 子:453
专家分:0
注 册:2006-1-10
得分:0 
以下是引用师妃暄在2007-8-29 12:04:30的发言:
把你存储过程的语句帖上来

/*
刪除前先驗証該料件是否存在于BOM表中﹐如果存在﹐則不允許刪除
刪除料件的同時﹐將刪除該料件的所有單价信息
*/
CREATE PROCEDURE [Part_Delete]
@partID varchar(18),
@errorMsg varchar(200) OUTPUT
AS
-- 在執行刪除前﹐先檢查要刪除的料號是否存在

IF ( @partID = '' )
BEGIN
SELECT @errorMsg = '沒有可刪除的記錄﹗'
RETURN
END

IF EXISTS ( SELECT 1 FROM [Part] WHERE [PartID] = @partID )
BEGIN
SELECT @errorMsg = '您指定的料號不存在﹗'
RETURN
END

-- 先檢查在Bom表中是否包含該料件的信息,如果存在﹐則不允許刪除
DECLARE @sampleID varchar(18), @SupplierID varchar(5), @count int -- 分別用于存儲包含該料件的BomID及記錄數量
SELECT @count = ( SELECT COUNT(1) FROM [BOM] WHERE [PartID] = @partID )
IF ( @count > 0 )
BEGIN
SELECT @sampleID = ( SELECT TOP 1 [SampleID] FROM [BOM] WHERE [PartID] = @partID ORDER BY [PartID] DESC )
SELECT @errorMsg = '該料號已存在于[ ' +@sampleID + ' ] 等 ' + LTRIM(STR(@count)) + ' 筆樣品單中﹐不允許刪除﹗'
RETURN
END

-- 開始執行刪除操作
BEGIN TRANSACTION
-- 如果有單价信息﹐則刪除相關的單价信息
IF EXISTS ( SELECT [PartID] FROM [Quotation] WHERE [PartID] = @partID)
BEGIN
DELETE FROM [Quotation] WHERE [PartID] = @partID
IF ( @@error <> 0 )
BEGIN
ROLLBACK TRANSACTION
SELECT @errorMsg = '刪除操作未完成﹗'
RETURN
END
END

DELETE FROM [Part] WHERE [PartID] = @partID
IF ( @@error <> 0 )
BEGIN
ROLLBACK TRANSACTION
SELECT @errorMsg = '刪除操作未完成﹗'
RETURN
END

COMMIT TRANSACTION

GO

不過我個人覺得﹐与存儲過程的關系應不大﹐因為如果有多筆記錄的話﹐刪除時不會不出錯的﹒

[此贴子已经被作者于2007-8-29 13:50:20编辑过]


帮助那些真正需要帮助的人,是对帮助你的人最好的回报!
2007-08-29 13:45
C_B_Lu
Rank: 1
等 级:新手上路
威 望:1
帖 子:453
专家分:0
注 册:2006-1-10
得分:0 
问题仍未解决,顶一下.

帮助那些真正需要帮助的人,是对帮助你的人最好的回报!
2007-08-29 19:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-166204-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.516282 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved