簡體   English   中英

在C#中刪除Winform應用程序上DataGridview的最后一行時出錯

[英]Error on Delete Last row of DataGridview on Winform Application in c#

我正在asp.net的Window應用程序中工作。 我有一個GUI,用戶可以在其中的文本框中輸入產品名稱和數量。 在添加按鈕上,單擊我要在Datagridview中添加新行,並在datagridview列中設置產品名稱和數量的值。 我不在數據庫中插入記錄,而僅在Datatable中保存記錄以及在Datagridview中添加記錄。

問題是,當我從datagridview中選擇最后一行並從鍵盤上按Delete鍵時,它會生成錯誤索引超出范圍。 必須為非負數並且小於集合的大小。 參數名稱:索引

static public DataTable gdt;
    private void btnAdd_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtItemCode.Text.Trim() == "")
            {
                MessageBox.Show("Enter Item Code");
                txtItemCode.Focus();
                return;
            }
            if (txtQty.Text.Trim() == "")
            {
                MessageBox.Show("Enter Qty");
                txtQty.Focus();
                return;
            }
            if (Convert.ToInt32(txtQty.Text.Trim()) <= 0)
            {
                MessageBox.Show("Qty must be greater than 0");
                txtQty.Focus();
                return;
            }

            if (btnAdd.Text == "ADD")
            {

                DataRow[] dr = gdt.Select("Item_Code = '" + txtItemCode.Text.Trim() + "'");

                if (dr.Length > 0)
                {
                    MessageBox.Show("Item Code Already Exist.");
                    txtItemCode.Text = "";
                    txtItemCode.Focus();
                    return;
                }

                tblItemMasterBLL oItem = new tblItemMasterBLL();
                int ItemID = 0;
                DataTable dt = new DataTable();
                dt = oItem.getItemDetailByItemCode(txtItemCode.Text.Trim());
                if (dt.Rows.Count > 0)
                {
                    ItemID = Convert.ToInt32(dt.Rows[0]["Item_ID"]);


                    gdt.Rows.Add();

                    gdt.Rows[gdt.Rows.Count - 1]["Item_Code"] = txtItemCode.Text.Trim();
                    gdt.Rows[gdt.Rows.Count - 1]["Item_ID"] = ItemID;
                    gdt.Rows[gdt.Rows.Count - 1]["Qty"] = txtQty.Text.Trim();

                    gdt.Rows[gdt.Rows.Count - 1]["Article_Desc"] = Convert.ToString(dt.Rows[0]["Article_Desc"]);
                    gdt.Rows[gdt.Rows.Count - 1]["Color_Desc"] = Convert.ToString(dt.Rows[0]["Color_Desc"]);
                    gdt.Rows[gdt.Rows.Count - 1]["Size_Desc"] = Convert.ToString(dt.Rows[0]["Size_Desc"]);
                    gdt.Rows[gdt.Rows.Count - 1]["MRP"] = Convert.ToString(dt.Rows[0]["MRP"]);


                    dgv_Items.DataSource = null;
                    dgv_Items.DataSource = gdt;




                }
                else
                {
                    MessageBox.Show("Invalid Item Code");
                }
                txtItemCode.Text = "";
                txtQty.Text = "";
            }
            else if (btnAdd.Text == "UPDATE")
            {
                if (gdt.Rows.Count > 0)
                {
                    gdt.Rows[Convert.ToInt32(lblhdnRowIndex.Text)]["Qty"] = txtQty.Text.Trim();
                    dgv_Items.Rows[Convert.ToInt32(lblhdnRowIndex.Text)].Cells["Qty"].Value = txtQty.Text.Trim();
                }
                txtItemCode.ReadOnly = false;
                txtItemCode.Text = "";
                txtQty.Text = "";
                lblhdnItemID.Text = "";
                lblhdnItemCode.Text = "";
                lblhdnQty.Text = "";
                btnAdd.Text = "ADD";
                lblhdnRowIndex.Text = "";
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void dgv_Items_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
    {
        try
        {
            if (MessageBox.Show("Do you want to delete the current row?", "Confirm deletion",
                MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                ScrollPosition = 0;
                ScrollPosition = dgv_Items.FirstDisplayedScrollingRowIndex;
                int iIndex = dgv_Items.CurrentRow.Index;

                    gdt.Rows.RemoveAt(iIndex);

            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void dgv_Items_UserDeletedRow(object sender, DataGridViewRowEventArgs e)
    {
        try
        {
            dgv_Items.DataSource = null;
            dgv_Items.DataSource = gdt;
            dgv_Items.Rows[dgv_Items.Rows.Count - 1].Visible = false;

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

怎么樣 ..

ScrollPosition = 0;
dgv_Items.FirstDisplayedScrollingRowIndex=ScrollPosition;
int iIndex = dgv_Items.CurrentRow.Index;

gdt.Rows.RemoveAt(iIndex);

謝謝大家參與解決我的問題。 實際上這是索引問題。 我找到了解決方案,在其中我對Datagridview的UserDeletingRow事件進行了更改。 我在UserDeletingRow中添加了新行,即使它是粗體。 現在我的代碼運行正常。

private void dgv_Items_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
            {
                try
                {
                    if (MessageBox.Show("Do you want to delete the current row?", "Confirm deletion",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        ScrollPosition = 0;
                        ScrollPosition = dgv_Items.FirstDisplayedScrollingRowIndex;
                        int iIndex = dgv_Items.CurrentRow.Index;

                            DataRow dr = gdt.Rows[iIndex]; //new added code
                            gdt.Rows.RemoveAt(iIndex);
                            gdt.Rows.InsertAt(dr, iIndex); //new added code
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM