Datagridview currentrow或selectedrow

时间:2017-08-08 05:40:44

标签: c# winforms datagridview

您好我有两个DataridViews,我希望datagridview1's第一行是当前行或选定行,所以当我点击"添加到购物车"按钮我不必点击第一行,它将转到datagridview2.

enter image description here

但我似乎无法做到。它仍然进入验证,请先请选择产品。 dgv1.Rows[0].Selected = true;无效。

我可以先点击一行然后点击&#34手动完成;添加到购物车"按钮,它将转到datagridview2。但我想自动完成。 为了让您知道我想要做的是条形码扫描,当您扫描条形码时,它将显示在datagridview1中并自动转到datagridview2

为了缩短故事,我只需要以编程方式选择datagridview1的第一行作为"当前行"或"选定的行"让我的代码工作。 你可以把它作为,我想以编程方式"点击"第一行。

但如果你们想看,这是我的代码。 这是我的条形码文本框textchanged事件的代码:

 private void txtBarcodeSearch_TextChanged(object sender, EventArgs e)
    {

        if (txtBarcodeSearch.Text != "" && txtBarcodeSearch.Text.Length == 13)
        {          
            crud.FillDataGrid("Select ProductID,BrandName,GenericName,Form,Dosage,Quantity,SellingPrice,D,VE from Products where (Status = 'Active' and Quantity > 0) and Barcode Like  '%" + txtBarcodeSearch.Text + "%'  ", ref dgvPOSproduct);

            dgvPOSproduct.Rows[0].Selected = true;
            clicktry();

            dgvPOSproduct.Columns[0].HeaderText = "ProductID";
            dgvPOSproduct.Columns[1].HeaderText = "Brand";
            dgvPOSproduct.Columns[2].HeaderText = "Generic";
            dgvPOSproduct.Columns[3].HeaderText = "Form";
            dgvPOSproduct.Columns[4].HeaderText = "Dosage";
            dgvPOSproduct.Columns[5].HeaderText = "Qty";
            dgvPOSproduct.Columns[6].HeaderText = "Price";
            dgvPOSproduct.Columns[7].HeaderText = "D";
            dgvPOSproduct.Columns[8].HeaderText = "VE";

            dgvPOSproduct.Columns[0].Width = 65;
            dgvPOSproduct.Columns[1].Width = 80;
            dgvPOSproduct.Columns[2].Width = 80;
            dgvPOSproduct.Columns[3].Width = 58;
            dgvPOSproduct.Columns[4].Width = 58;
            dgvPOSproduct.Columns[5].Width = 45;
            dgvPOSproduct.Columns[6].Width = 55;
            dgvPOSproduct.Columns[7].Width = 35;
            dgvPOSproduct.Columns[8].Width = 35;

            if (dgvPOSproduct.Rows.Count == 1)
            {
                dgvPOSproduct.Rows[0].Selected = true;
                clicktry();
            }

        }
        else
        {
            dgvProductSettings();
        }


    }

这是clicktry方法代码: -

 private void clicktry()
    {
        if (!validateProduct())
        {
            return;
        }
        else if (!QtyDialog())
        {
            return;
        }

        if (!notIncartyet())
        {
            return;
        }
        else
        {
            int str, qty;
            str = Convert.ToInt32(storeqty.Text);
            qty = Convert.ToInt32(quantity.Text);
            temporaryquantity.Text = str.ToString();

            if (str < qty || str == 0)
            {
                MessageBox.Show("Insufficient Stock", "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                continuetocart();
            }
        }
    }

这是继续推车的方法: -

  private void continuetocart()
    {
        dgvPOSproduct.CurrentCell = dgvPOSproduct.Rows[0].Cells[0];     
        qty = Convert.ToInt32(quantity.Text);
        unitprice = Convert.ToDouble(dgvPOSproduct.CurrentRow.Cells[6].Value.ToString());
        totalprice = qty * unitprice;
        unittotal.Text = totalprice.ToString("0.00");

        addData
            (
            dgvPOSproduct.CurrentRow.Cells[0].Value.ToString(), //prod id
            dgvPOSproduct.CurrentRow.Cells[1].Value.ToString(), //brand
            dgvPOSproduct.CurrentRow.Cells[4].Value.ToString(), //dosage
            dgvPOSproduct.CurrentRow.Cells[6].Value.ToString(), //qty
            quantity.Text,
            unittotal.Text,
           dgvPOSproduct.CurrentRow.Cells[7].Value.ToString(),
            dgvPOSproduct.CurrentRow.Cells[8].Value.ToString()
            );

        int dgvPOSquantity = Convert.ToInt32(dgvPOSproduct.CurrentRow.Cells[5].Value.ToString());
        int dgvnewquantity;
        dgvnewquantity = dgvPOSquantity - qty;
        dgvPOSproduct.CurrentRow.Cells[5].Value = dgvnewquantity;
        discountremoveitem();

    }

3 个答案:

答案 0 :(得分:2)

做这样的事情:

//声明一个全局变量

int ? selectedRow = null;

public void LoadList()
{ 

// reset global variable 
selectedRow = null;

List<string> collection = new List<string> { "Item 1" };

gridView.DataSource = collection ;

if (gridView.Rows.Count = 1)
{
  selectedRow = 0;
}

}

在您的添加到购物车事件中执行以下操作:

private void button1_Click(object sender, EventArgs e)
{
   if (selectedRow.HasValue)
   {
     DataGridViewRow dgRow = dataGridView1.Rows[selectedRow.Value];

    //move your data to cart

    // reset variable
    selectedRow = null;
   }
   else
   {
   //show a message that none is seleted;
   return;
   }

}

答案 1 :(得分:1)

currentrow的概念与所选择的行之间存在差异,因为当前行是一个奇异属性,并且只能引用一行,但selectedrow可以是一个集合。 Currentrow指的是其单元格周围有虚线框/键盘焦点的行

我认为你应该调整你的程序的逻辑,这样它不应该试图确保当前行总是有一个值,而应该看看当前行是否为空。如果它为null并且网格中只包含一行,则取该行。如果有多行,请让用户单击他们想要的行

答案 2 :(得分:0)

虽然您无法直接设置CurrentRow属性(只读),但CurrentRow始终是您可以设置的当前单元格的行。因此,在加载数据后,您可以通过添加以下行来确保第一行是当前行:

dgvPOSproduct.CurrentCell = dgvPOSproduct.Rows[0].Cells[0];

在尝试此操作之前,您应该检查Rows计数是否大于0,否则您将获得索引超出范围的错误。