【问题标题】:Reading data for oracle reader to fill datagridview为oracle阅读器读取数据以填充datagridview
【发布时间】:2017-01-21 04:57:32
【问题描述】:

当用户输入产品 ID 时,我的表单具有 textbox 作为产品 ID 我正在从 oracle 数据库中获取产品的详细信息(如 PRODUCT_DESC、UNIT_PRICE、...等),然后将其填写在 datagridview 以创建购买产品列表

我尝试加载数据集,但添加新产品 ID 时会删除旧记录

我尝试循环 dataset 并提取我想要的值,然后将它们添加到 datagridview 中的列中,这里的循环没有用,因为只有一条记录,但不会在 datagridview 上加载数据

请问怎么办??

有没有更好的方法来做到这一点?

    private void SelectedProductData()
    {
        string connstr = @"Data Source=orcl; User Id=user; password=pwd;";
        string cmdtxt = @"SELECT PRODUCT_ID,
                                 PRODUCT_DESC,
                                 UNIT_PRICE,
                                 QUANTITY,
                                 MEASUREMENT_UNIT,
                                 MANUFACTORY
                          FROM WAREHOUSE
                            WHERE PRODUCT_ID = :P_Product_ID";

        using (OracleConnection conn = new OracleConnection(connstr))
        using (OracleCommand cmd = new OracleCommand(cmdtxt, conn))
        {
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = cmdtxt;

            cmd.Parameters.Add(new OracleParameter(":P_Product_ID", OracleDbType.Int32)).Value = TB_Product_ID.Text;

            conn.Open();
            OracleDataReader oraReader = cmd.ExecuteReader();

            DataTable dt = new DataTable();
            dt.Load(oraReader);

            while (oraReader.Read())
            {
                DGV_INVOICE.CurrentCell.Value = oraReader.GetString(0);
            }
            //foreach (DataRow dr in dt.Rows)
            //{
            //    DGV_INVOICE.Rows[0].Cells[0].Value = dt.Rows[0]["PRODUCT_ID"].ToString();
            //}
        }
    }

代码更新

private void TB_Product_ID_Leave(object sender, EventArgs e)
{
    SelectedProductData();
}

方法

private void SelectedProductData()
{
    string connstr = @"Data Source=JDT; User Id=admin; password=admin;";
    string cmdtxt = @"SELECT PRODUCT_ID,
                             PRODUCT_DESC,
                             UNIT_PRICE,
                             QUANTITY,
                             MEASUREMENT_UNIT,
                             MANUFACTORY
                      FROM WAREHOUSE
                        WHERE PRODUCT_ID = :P_Product_ID";

    using (OracleConnection conn = new OracleConnection(connstr))
    using (OracleCommand cmd = new OracleCommand(cmdtxt, conn))
    {
        conn.Open();

        cmd.CommandType = CommandType.Text;
        cmd.CommandText = cmdtxt;

        cmd.Parameters.Add(new OracleParameter(":P_Product_ID", OracleDbType.Int32)).Value = TB_Product_ID.Text;

        OracleDataReader oraReader = cmd.ExecuteReader();

        DataTable dt = new DataTable();

        dt.Load(oraReader);

        while (oraReader.Read())
        {
            DataGridViewRow dgvRow = new DataGridViewRow();
            dgvRow.Cells[0].Value = oraReader.GetValue(2);
            //dgvRow.Cells[0].Value = oraReader.GetString(2);
            //dgvRow.Cells[0].Value = oraReader.GetString(3);
            //dgvRow.Cells[0].Value = oraReader.GetString(4);

            DGV_INVOICE.Rows.Add(dgvRow);
        }
        MessageBox.Show("done");
    }
}

【问题讨论】:

  • @JohnG 我没有将数据源设置为 DataGridView First 1. 因为我手动创建了列,我想从数据库中填充行并在我想要的列中插入每个列值......因为在这些列有计算列,这些列将根据我从数据库中获得的数据进行计算,例如总价将根据数据库中的 unit_price 值乘以单元数来计算......等等......第二个 2. 如果我加载了 DataGridView,它将删除以前输入的记录并加载新的记录......对不起我的英语不好。希望现在很清楚
  • @JohnG 我上传了一张图片以使事情更清楚 我不会从数据库中重新读取两次数据 我正在读取数据 我想将其插入到 DataGridView 的特定列中,这将是午餐DataGridView 上的一个事件将计算总价格列,如果我在搜索时加载数据集并在网络上找到将删除以前的记录并加载新记录...示例我输入了价格为 1000 并命名为 test1 的产品 1当用户请求不会在DataGridView中加载另一条记录的新产品时,会将新记录加载到DataGridView并删除旧记录
  • @JohnG 是 图像显示用户看到的内容并更新图像以让您知道总价格列和列 1.2.3 来自数据库根据产品 ID 用户将输入数字 123 是每个应该加载的位置它不应该作为 DataGridView 列末尾的额外列加载,当我加载数据集时,我在右侧第 1 列中的 1 和第 2 列中的 2 加载数据集,而不是现在显示的...读取标记是该列1 乘以第 2 列减去第 3 列将得到总价格列中的数据,即我所说的计算列
  • @JohnG 左侧的第 1 列应该在右侧的第 1 列中,即数字的含义

标签: c# winforms c#-4.0 datagridview


【解决方案1】:

我认为您需要正确实现如何向 datagridview 添加新行。

一旦您在阅读器中获得可用数据,您就可以使用以下逻辑添加新行并为 datagridview 设置列值。

while (oraReader.Read())
{
    DataGridViewRow dgvRow = new DataGridViewRow();
    dgvRow.Cells.Add(new DataGridViewCheckBoxCell());
    dgvRow.Cells[0].Value = true;
    dgvRow.Cells.Add(new DataGridViewTextBoxCell());
    dgvRow.Cells[1].Value = oraReader.GetString(1);

    //AND so on....
    //You need to add appropriate cells to the row and assign values to the cells. 

    //And finally add the row to the data grid view.
    DGV_INVOICE.Rows.Add(dgvRow);
}

这里,while 循环将只执行一次,因为 reader 将只有一个对象的数据。但这会在 datagridview 中创建一个新行并设置列的值。

【讨论】:

  • 非常感谢您的帮助,这看起来像我想要的,但我收到错误由于对象的当前状态,操作无效。我检查了 DataGridView 的编辑模式及其 EditProgrammatically 和所有列 NOT read Only Columns ... 还有什么要检查的吗?
  • 您在哪一行收到此错误?您是否在单击按钮时调用“SelectedProductData”方法?
  • 是的,我在单击按钮时调用 SelectedProductData,但在 while (oraReader.Read()) 处出现错误
  • 你能分享新版本的方法“SelectedProductData”吗?
  • 尝试删除“DataTable dt = new DataTable(); dt.Load(oraReader);”从方法上。您没有在方法中的任何地方使用阅读器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
相关资源
最近更新 更多