您好我有两个DataridViews,我希望datagridview1's
第一行是当前行或选定行,所以当我点击"添加到购物车"按钮我不必点击第一行,它将转到datagridview2.
但我似乎无法做到。它仍然进入验证,请先请选择产品。 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();
}
答案 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,否则您将获得索引超出范围的错误。