C# Datagridview当前行或selectedrow

C# Datagridview当前行或selectedrow,c#,winforms,datagridview,C#,Winforms,Datagridview,您好,我有两个DataRidView,我希望datagridview1的第一行是当前行或选定行,因此当我单击“添加到购物车”按钮时,我不必单击第一行,它将转到datagridview2。 但我似乎做不到。它还进入验证,说请先选择产品dgv1。行[0]。所选=真不工作 我可以通过先单击一行,然后单击“添加到购物车”按钮来手动执行此操作,它将转到datagridview2。但我想自动完成。 为了让您了解我正在尝试做的是条形码扫描,当您扫描条形码时,它将显示在datagridview1中,并自动转到

您好,我有两个DataRidView,我希望
datagridview1的
第一行是当前行或选定行,因此当我单击“添加到购物车”按钮时,我不必单击第一行,它将转到
datagridview2。

但我似乎做不到。它还进入验证,说请先选择产品<代码>dgv1。行[0]。所选=真不工作

我可以通过先单击一行,然后单击“添加到购物车”按钮来手动执行此操作,它将转到
datagridview2
。但我想自动完成。 为了让您了解我正在尝试做的是条形码扫描,当您扫描条形码时,它将显示在datagridview1中,并自动转到
datagridview2

简而言之,我只需要以编程方式选择datagridview1的第一行作为代码工作的“当前行”或“选定行”。 您可以将其设置为,我希望以编程方式“单击”第一行

但如果你们想看的话,这是我的密码。 这是我的条形码textbox 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();
            }
        }
    }

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


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

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


我认为您应该调整程序的逻辑,这样它就可以查看当前行是否为空,而不是试图确保当前行始终有一个值。如果它为null,并且网格中只包含一行,则取该行。如果有多行,请用户单击他们想要的行,执行以下操作:

//声明一个全局变量

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;
}

}

这样做:

//声明一个全局变量

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;
}

}

虽然不能直接设置CurrentRow属性(它是只读的),但CurrentRow始终是当前单元格的行,可以进行设置。因此,在加载数据后,可以通过添加以下行来确保默认情况下第一行为当前行:

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

在尝试此操作之前,应检查行数是否大于0,否则将出现索引越界错误。

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

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

在尝试此操作之前,应检查行数是否大于0,否则将出现索引越界错误。

validateProduct()是否显示此验证消息?是否在那里检查dgvPOSproduct.CurrentRow是否为null?crud.FillDataGrid()如何将数据加载到网格?谢谢,先生,我意识到我的验证是错误的。当我在datagridview中单击一个单元格时,它的ID被放在一个文本框中,我的validateProduct()只是检查该标签是否为null。如果产品尚未选定或当前已选定,则验证的正确方法是什么?先生,validateProduct()显示此验证消息?是否在那里检查dgvPOSproduct.CurrentRow是否为null?crud.FillDataGrid()如何将数据加载到网格?谢谢,先生,我意识到我的验证是错误的。当我在datagridview中单击一个单元格时,它的ID被放在一个文本框中,我的validateProduct()只是检查该标签是否为null。如果产品尚未选择或当前已选择sir,验证的正确方法是什么?它表示datagridview不包含DataBind和SelectedRow sir的定义。没有selectedindex,也没有gridviewrow,但有DataGridViewRow,我以为这是一个web应用程序。我已经更新了我的回复。我的坏:)是的,先生,我会的。我似乎仍然不能使它工作。它给了我一个“显示一条没有选择的消息”(我把它放在一个消息框中)。给我几分钟,先生。我想这是因为我的代码很乱。记住,返回的数据必须是一个,然后变量才会有值。它说datagridview不包含DataBind和SelectedRow的定义,先生。没有selectedindex,也没有gridviewrow,但有DataGridViewRow,我以为这是一个web应用程序。我已经更新了我的回复。我的坏:)是的,先生,我会的。我似乎仍然不能使它工作。它给了我一个“显示一条没有选择的消息”(我把它放在一个消息框中)。给我几分钟,先生。我想这是因为我的代码很乱。记住,返回的数据必须是一个,然后变量才会有值。谢谢,先生,我试过这么做,但仍然不起作用。也许我的代码中还有其他错误。谢谢你,先生。我试过这么做,但仍然不起作用。也许我的代码中还有其他错误。谢谢你,先生,但不幸的是它没有工作。问题差不多解决了,谢谢你,先生,但不幸的是,它并没有起作用。现在问题差不多解决了,谢谢