【问题标题】:How to add a row into datatable on button click event?如何在按钮单击事件中将一行添加到数据表中?
【发布时间】:2013-11-14 21:47:33
【问题描述】:

Windows 窗体 中,我想通过从其他控件获取值来逐行添加按钮单击事件上的 DataGridView。在这种情况下,我使用的是 DataTable,它绑定到 DataGridView。

我正在使用以下代码,第一次插入数据时它工作正常。但是我的问题是当我第二次点击按钮时,第一行被第二行数据覆盖了。

private void btnAddToGrid_Click(object sender, EventArgs e)
{
        LoadDataGridView();
}

private void LoadDataGridView()
{
        dgvAdjustment.DataSource = GetAdjustmentTable();
}

private DataTable GetAdjustmentTable()
{
        DataTable adjustmentTable = new DataTable();

        DataColumn dataColumn;
        dataColumn = new DataColumn("SourceOutletID", typeof(int));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("DestinationOutletID", typeof(int));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("TransactionDate", typeof(DateTime));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("MaterialName", typeof(string));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("AdjustmentType", typeof(int));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("CurrentBalance", typeof(decimal));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("AdjustmentQty", typeof(decimal));
        adjustmentTable.Columns.Add(dataColumn);
        dataColumn = new DataColumn("NewBalance", typeof(decimal));
        adjustmentTable.Columns.Add(dataColumn);

        DataRow dataRow = adjustmentTable.NewRow();
        dataRow[0] = cmbSourceOutlet.SelectedValue;
        dataRow[1] = cmbDestinationOutlet.SelectedValue;
        dataRow[2] = TransDateTimePicker.Value;
        dataRow[3] = cmbMaterialName.SelectedValue;
        dataRow[4] = cmbAdjustmentType.SelectedValue;
        dataRow[5] = Convert.ToDecimal(lblCurBalVal.Text);
        dataRow[6] = Convert.ToDecimal(lblAdjVal.Text);
        dataRow[7] = Convert.ToDecimal(lblNewQtyVal.Text);

        int insertPosition = adjustmentTable.Rows.Count;
        adjustmentTable.Rows.InsertAt(dataRow, insertPosition);

        return adjustmentTable;
}

ASP .NET 应用程序中,我使用会话状态来检查 DataTable 是否为空,使用以下代码:

protected void Button1_Click(object sender, EventArgs e)
{
  try
  {
     //Check if previous session is exist
     if (Session["MyTable"] == null)
     {
         dtMyTable = new DataTable("MyTable");
         dtMyTable.Columns.Add("Id", typeof(int));
         dtMyTable.Columns.Add("LName", typeof(string));

     }
     else
     {
         //If yes then get it from current session
         dtMyTable = (DataTable)Session["MyTable"];
     }

     //Add new row every time
     DataRow dt_row;
     dt_row = dtMyTable.NewRow();
     dt_row["Id"] = TextBox1.Text;
     dt_row["LName"] = TextBox2.Text;
     dtMyTable.Rows.Add(dt_row);

     //Update session table
     Session["MyTable"] = dtMyTable;
  }
  catch (Exception ex)
  {

     Response.Write(ex.Message);
  }
}

我可以做什么以及如何进行更改以在 Windows 窗体 中获得正确的解决方案?任何帮助将不胜感激!

【问题讨论】:

    标签: c# winforms datagridview datatable databound


    【解决方案1】:

    GetAdjustmentTable 中,您每次都在重新创建adjustmentTable。因此,新行只会覆盖现有行。

    您需要修改代码,使adjustmentTable 只创建一次,随后的调用会向其中添加行。一种方法是将其设为私有字段并检查它是否为空,如果为空则创建它:

    private DataTable _adjustmentTable;
    
    private DataTable GetAdjustmentTable()
    {
        if (adjustmentTable == null)
        {
            adjustmentTable = new DataTable();
        }
        ....
    

    【讨论】:

    • 你完全正确!我在方法之外声明了 DataTable 并检查了 DataTable 是否为空。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2017-11-08
    • 2016-09-13
    • 1970-01-01
    相关资源
    最近更新 更多