Как установить позицию прокрутки в datagridview в C # winform, когда клавиша ввода используется в событии keydown? - PullRequest
0 голосов
/ 12 мая 2018

У меня проблемы с настройкой положения вертикальной прокрутки.Я следовал за этим подобным вопросом , и я получил ожидаемый результат для CellDoubleClick Event.Но для KeyDown Event, когда пользователь нажимает клавишу Enter, он сбрасывает вертикальную позицию прокрутки вверху

Это мои CellDouble Click и KeyDown события.

    private void dataGridSrch_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            addToSell();
        }
    }

    private void dataGridSrch_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        addToSell();
    }

Это моя addToSell функция, эта функция вызовет after, которая обновит DataGridView.

    public void addToSell()
    {
        if (dataGridSrch.SelectedRows.Count > 0)
        {
            DataRow row = (dataGridSrch.SelectedRows[0].DataBoundItem as DataRowView).Row;
            if (Convert.ToInt32(row["Stock"].ToString()) > 0)
            {
                string sellProd = row["Brand"].ToString() + " " + row["Part No."].ToString();
                int sellQty = Convert.ToInt32(numSell.Value);
                string sellUnit = row["Unit"].ToString();
                double sellPrice = double.Parse(row["Price"].ToString()) * sellQty;
                double sPrice = double.Parse(row["Price"].ToString());
                dataGridSales.Rows.Add(sellProd, sellQty, sellUnit, sellPrice, sPrice, row["Part No."].ToString(), row["Stock"].ToString());
                int count = 0;
                double total = 0;
                for (int i = 0; i < dataGridSales.Rows.Count; i++)
                {
                    total += Convert.ToDouble(dataGridSales.Rows[i].Cells[3].Value);
                    count += Convert.ToInt32(dataGridSales.Rows[i].Cells[1].Value);
                }
                lblTotAmt.Text = "Total Amount: " + total.ToString("C2");
                lblTotItem.Text = "Total Items: " + count;
                amount = total;
                {
                    conn.Open();
                    using (SqlCommand cmd = new SqlCommand(@"UPDATE [dbo].[products]
                    SET Stock = Stock - '" + sellQty + "' WHERE [Part No.] = '" + row["Part No."] + "'", conn))
                    {
                        cmd.ExecuteNonQuery();
                    }
                    conn.Close();
                }
>>>>>>>>>>>>>>>>after(); //THIS IS WHERE AFTER FUNCTION IS CALLED
            }
            else
            {
                MessageBox.Show("You dont have any stock for the selected item, please restock immediately.", "Please restock", MessageBoxButtons.OK);
            }
        }
        if (dataGridSales.Rows.Count > 0)
        {
            cmbMOP.Enabled = true;
        }
    }

И это моя after функция.

    public void after()
    {
        string item = cmbItem.Text;
        string brand = cmbBrand.Text;
        string part = txtPart.Text;
        string manu = cmbMan.Text;
        string car = cmbCar.Text;
        string year = cmbYr.Text;
        conn.Open();
        {
            int index = dataGridSrch.SelectedRows[0].Index;
>>>>>>>>>>>>int scrollPos = dataGridSrch.FirstDisplayedScrollingRowIndex; //GET THE SCROLL POSITION
            string sel = @"SELECT * FROM[dbo].[products] WHERE 1=1";
            using (SqlCommand cmd = new SqlCommand())
            {
                if (!string.IsNullOrEmpty(item))
                {
                    sel += " AND Item = @Item";
                    cmd.Parameters.Add("@Item", SqlDbType.VarChar).Value = item;
                }
                if (!string.IsNullOrEmpty(brand))
                {
                    sel += " AND Brand = @Brand";
                    cmd.Parameters.Add("@Brand", SqlDbType.VarChar).Value = brand;
                }
                if (!string.IsNullOrEmpty(part))
                {
                    sel += " AND [Part No.] = @Part";
                    cmd.Parameters.Add("@Part", SqlDbType.VarChar).Value = part;
                }
                if (!string.IsNullOrEmpty(manu))
                {
                    sel += " AND Manufacturer = @Manufacturer";
                    cmd.Parameters.Add("@Manufacturer", SqlDbType.VarChar).Value = manu;
                }
                if (!string.IsNullOrEmpty(car))
                {
                    sel += " AND Car = @Car";
                    cmd.Parameters.Add("@Car", SqlDbType.VarChar).Value = car;
                }
                if (!string.IsNullOrEmpty(year))
                {
                    sel += " AND Year = @Year";
                    cmd.Parameters.Add("@Year", SqlDbType.VarChar).Value = year;
                }
                cmd.CommandText = sel;
                cmd.Connection = conn;
                using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
                {
                    DataTable dt = new DataTable();
                    DataView dv = dt.DefaultView;
                    sda.Fill(dt);
                    dataGridSrch.DataSource = dt;
                    dv.Sort = "Item, Brand, Manufacturer, Car, Year, Price ASC ";
                    dataGridSrch.Columns["Price"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                    dataGridSrch.Columns["Price"].DefaultCellStyle.Format = "C2";
                    dataGridSrch.Columns["Stock"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                    dataGridSrch.Rows[index].Selected = true;
>>>>>>>>>>>>>>>>>>>>dataGridSrch.FirstDisplayedScrollingRowIndex = scrollPos; //AFTER UPDATE SET THE SCROLL POSITION
                    typeof(DataGridView).InvokeMember("DoubleBuffered", BindingFlags.NonPublic |
                                                       BindingFlags.Instance | BindingFlags.SetProperty, null,
                                                       dataGridSrch, new object[] { true });
                }
            }
        }
        conn.Close();
    }

Я также изменил свой KeyDown Event на этот

    private void dataGridSrch_KeyDown(object sender, KeyEventArgs e)
    {
        int index = dataGridSrch.SelectedRows[0].Index;
        int scrollPos = dataGridSrch.FirstDisplayedScrollingRowIndex;
        if (e.KeyCode == Keys.Enter)
        {
            addToSell();
            dataGridSrch.Rows[index].Selected = true;
            dataGridSrch.FirstDisplayedScrollingRowIndex = scrollPos;
        }
    }

Но все равно он сбрасывает позицию прокрутки.

...