0

私はC#とwinformsに慣れていないので、助けが必要です。

「 order_lines」と「products 」の 2 つのテーブルを作成しdatasetて挿入しました。空のテーブル(データなし)であるテーブル「 order_lines 」から取得した列があります。datagridview

したがって、datagridview私には3つの空の列があります:quantityproduct combobox他のデータセットテーブルから取得したものですproductsと、total自分で作成した列(およびなどの他のすべての列は表示されません)product_idorder_num

datagridviewユーザーが列の数量(挿入番号)から列の製品(コンボボックスから製品を選択) にデータを編集および挿入できるようにしようとしていますquantity*product_price 。コンボボックスには各製品にIDがあり、価格はproducts 製品に応じてテーブルから取得する必要がありますid)

私には2つの問題があります:

  1. cell_validatingユーザーが挿入したデータをイベントでチェックしようとしていdata_error ますが、機能しません。ユーザーが無効なデータを入力したときにエラーメッセージが表示される代わりに、"object cannot be cast from dbnull to other types"理由がわからない例外が発生します
  2. datasetテーブルから価格を取得productsし、選択した製品に応じて合計列で使用することができていないようです(データセットテーブル「 order_lines」を表示するデータグリッドビューでは、データセットテーブルにも非表示の列「product_id」があります「製品」列「product_id」と「product_name」があります。これはデータグリッドビューのコンボボックスです) ユーザーが製品を選択すると、価格を取得する必要があります。

私は自分の質問を説明できたことを願っています。どんなアイデアでも大歓迎です

4

1 に答える 1

0

これは私があなたにそれをすることを提案する方法です:

DataTable products;

public Form1()
{
    InitializeComponent();

    // handle cell changes
    dataGridView1.CellValueChanged += dataGridView1_CellValueChanged;

    // used for manually raising the ComboBox change
    dataGridView1.CurrentCellDirtyStateChanged += dataGridView1_CurrentCellDirtyStateChanged;
}

void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    // return if the row or column headers were changed
    if (e.RowIndex < 0 || e.ColumnIndex < 0)
        return;
    if (e.ColumnIndex != dataGridView1.Columns["total"].Index)
    {
        var value = 0;

        // get the product id from the ComboBox
        var product = dataGridView1.Rows[e.RowIndex].Cells[dataGridView1.Columns["Product"].Index].Value;

        // get the quantity
        var quantity = dataGridView1.Rows[e.RowIndex].Cells[dataGridView1.Columns["TotalQuantity"].Index].Value.ToString();

        if (product != null && !String.IsNullOrEmpty(quantity))
        {
            value =
                int.Parse(quantity) *
                int.Parse(products.Select("product_id = " + product.ToString())[0]["product_price"].ToString());

            dataGridView1.Rows[e.RowIndex].Cells[dataGridView1.Columns["total"].Index].Value = value;
            dataGridView1.Invalidate();
        }
    }
}

void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
于 2013-01-16T14:39:59.013 に答える