2016-05-21 18 views
1

特定の行を選択すると、DataGridViewでカラム ''のセル値を更新または変更する方法を尋ねます。 DataGridViewには、Item NameQuantityPriceの3つの列があります。 フォーム上で「追加」または「less」ボタンをクリックするたびに、選択した行アイテムの数量が数量欄に追加または減算され、数量が増減するたびに価格も更新されます。 DataGridViewにアイテムを追加するときのコードは次のとおりです。ボタン上のDataGridViewセルの値を変更する

データグリッドにアイテムを追加することが適切かどうかはわかりません。

cmd = new MySqlCommand("SELECT * FROM tblmenu", dbConn); 
MySqlDataReader rdr = cmd.ExecuteReader(); 
while (rdr.Read()) 
{ 
    Button btn = new Button(); 
    btn.Text = rdr["menuName"].ToString(); 
    btn.Width = 126; 
    btn.Height = 80; 
    btn.Click += delegate 
    { 
     MySqlConnection cnn2 = new MySqlConnection(sqlConn.connString); 
     cnn2.Open(); 
     cmd = new MySqlCommand("SELECT menuName, menuPrice FROM tblmenu WHERE menuName = @name", cnn2); 
     cmd.Parameters.AddWithValue("@name", btn.Text); 
     MySqlDataReader rdr2 = cmd.ExecuteReader(); 
     while (rdr2.Read()) 
     { 
      dataGridView1.Rows.Add(rdr2.GetString("menuName").ToUpper(), 1, rdr2.GetDouble("menuPrice")); 
     } 
     dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 
     lblQty.Text = dataGridView1.RowCount.ToString(); 
    }; 
} 

私はこれを試しましたが、別のアイテムセットをクリックすると、前の選択アイテムからの数量が増分されます。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
{ 
    Add.Click += delegate 
    { 
     dataGridView1.Rows[e.RowIndex].Cells["quantity"].Value = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells["quantity"].Value) + 1; 
    }; 
    Minus.Click += delegate 
    { 
     dataGridView1.Rows[e.RowIndex].Cells["quantity"].Value = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells["quantity"].Value) - 1; 
    }; 
} 

答えて

0

まず、dataGridView1_CellContentClickを使用しても目的には一切役立たない。追加またはマイナスボタンクリックで数量を増減する予定です。 DataGridView1.CurrentRowプロパティを使用してCurrentRowを保持し、quantity列を操作します。価格列を更新するには、Rate列または一定のRate値を使用して数量を掛ける必要があります。あなたはそれを手に入れましたか?そうでなければ、私はあなたが価格計算にどのように到着するかを見ません。しかし、あなたは1を持っていると仮定すると:

void quantity_change(object sender, EventArgs e){ 
    var row=dataGridView1.CurrentRow; 

    if(row==null || row.Index<0) 
    return; 
    var unit = (sender==add)?1:-1; 
    var quantity = Convert.ToInt32(row.Cells["quantity"].Value) + unit; 

    row.Cells["quantity"].Value = quantity; 
    //assuming you have rate column... 
    var rate = Convert.ToDouble(row.Cells["Rate"].Value); 
    row.Cells["Price"].Value = quantity * rate; 
} 

今すぐフォームのコンストラクタでは、上記の方法にあなたの追加&マイナスボタンのイベントをクリックしてバインドします。

public myForm(){ 
    InitializeComponents(); 
    Add.Click+=quantity_change; 
    Minus.Click+=quantity_change; 
} 

必要に応じて、フォームのLoadイベントを使用することもできます。

+0

うわー。それは動作します:)私の問題は、現在、追加またはマイナスボタンをクリックするたびに数量の列または価格を動的に掛ける方法です。 – LazyPirate

+0

価格の更新要件に基づいて回答を改善しました。あなたの問題を解決するなら、私の答えを受け入れてください。 @Verdolinoの答えが示唆していることも慎重に読んでください。その正しい練習と非常に良い答え。私のupvoteに値する。 –

+0

@LazyPirate私の答えがあなたの問題を解決したことをうれしく思っています。 –

2

DataGridViewをデータソースにバインドすることをお勧めします。 UIでデータ操作を実行しないでください。これを実証するために

private void quantityChangeClick(object sender, EventArgs e) 
{ 
    addToQuantity((Button)sender == this.Add ? 1 : -1); 
    updateTotal(); 
} 

private void addToQuantity(int howMuch) 
{ 
    var selectedRowIndices = dataGridView1.SelectedRows.OfType<DataGridViewRow>().Select(ro => ro.Index); 
    this.rows.Where((r, i) => selectedRowIndices.Contains(i)).ToList().ForEach(
     r => r.Quantity = Math.Max(0, r.Quantity + howMuch)); 

    this.dataGridView1.Refresh(); 
} 

// calculate the total from the data source as well 
private void updateTotal() 
{ 
    var total = Math.Round(this.rows.Sum(r => r.Quantity * r.Price), 2, MidpointRounding.AwayFromZero); 
    this.TotalLabel.Text = string.Format("₱{0:0.00}", total); 
} 

私は、行のクラスで、私の最後でこれをデモするために、いくつかのダミーデータを使用しています。実際には、同様のことを行い、データベースの各レコードを持つ行をデータソース行に追加することができます。

private class Row 
{ 
    public string ItemName { get; set; } 
    public int Quantity { get; set; } 
    public double Price { get; set; } 
    public Row(string i, int q, double p) 
    { 
     this.ItemName = i; 
     this.Quantity = q; 
     this.Price = p; 
    } 
} 

private List<Row> rows = new List<Row>(); 

private void Form1_Load(object sender, EventArgs e) 
{ 
    // instead, here you will add your rows from SQL 
    rows.AddRange(new Row[] 
    { 
     new Row("item1", 0, 500), 
     new Row("item2", 0, 400), 
     new Row("item3", 0, 850) 
    }); 
    this.dataGridView1.DataSource = rows; 
    dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 
    Add.Click += quantityChangeClick; 
    Minus.Click += quantityChangeClick; 
} 

Example

関連する問題