2017-08-08 59 views
0

嗨,我有一个两个DataridViews,我想datagridview1's第一行是当前或选定的行,所以当我点击“添加到购物车”按钮,我不必点击第一行,它会去到datagridview2.Datagridview currentrow or selectedrow

enter image description here

,但我似乎无法做到这一点。它还是进入验证说请先选择产品。 dgv1.Rows[0].Selected = true;不起作用。

我可以通过先点击一行然后点击“添加到购物车”按钮,它会去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

validateProduct()显示此验证消息?你检查那里dgvPOSproduct.CurrentRow为空? crud.FillDataGrid()如何将数据加载到网格? –

+0

谢谢先生,我知道我的验证是错误的。当我点击datagridview中的单元格时,它的ID被放置在一个文本框中,我的validateProduct()只是检查该标签是否为null。什么是验证产品是否尚未被选择或当前选择的合适先生? – FutureDev

回答

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

} 
+0

它说datagridview不包含DataBind和SelectedRow先生的定义。并没有选择索引太 – FutureDev

+0

并没有gridviewrow,但有datagridviewrow – FutureDev

+0

好吧,我认为这是一个Web应用程序。我已经更新了我的回复。我的坏:) –

1

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

我认为您应该调整程序的逻辑,以便不要试图确保当前行始终有值,而应该看看如果当前行是空的。如果它为空,并且网格中只包含一行,则取该行。如果有多个行,要求用户点击一排,他们希望

+0

谢谢先生,我试过这样做,但它仍然没有工作。也许在我的代码中还有其他错误。 – FutureDev

0

虽然你不能直接设置CurrentRow属性,(它是只读)的CurrentRow始终是当前单元格,您可以设置的行。所以,你的数据加载后,可以确保第一行是默认电流通过加入如下一行:

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

你应该尝试此,该行数大于0前检查,否则就会获得索引超出界限的错误。

+0

谢谢先生,但它不幸的工作。问题现在几乎解决了,谢谢 – FutureDev