【问题标题】:Adding new row to a DataTable向 DataTable 添加新行
【发布时间】:2012-10-03 20:30:06
【问题描述】:

我的表单中有一个 GeidView,我有一个按钮,它通过向 Datatable 添加一行来向 GridView 添加新记录,然后将此 DataTable 作为 GridContol 的数据源。

问题是当我添加一条新记录时,它会显示在 GridView 中,但是当我添加另一个 rocord 时它不会显示在 GridView 中,GridView 始终包含我添加到 DataTable 的第一行!

那么请你帮我解决这个问题?

这是源代码:

private DataTable recompensesTable;

private void AjoutLivre_Load(object sender, EventArgs e)
        {
          recompensesTable = MakeRecomponsesTable();
          recompenseGridControl.DataSource = recompensesTable;
        }
private DataTable MakeRecomponsesTable()
        {
            DataTable recmpensesTable = new DataTable("Recompenses");

            var anneeColumn = new DataColumn();
            anneeColumn.DataType = Type.GetType("System.Int32");
            anneeColumn.ColumnName = "Année";
            recmpensesTable.Columns.Add(anneeColumn);

            var prixLiteraireColumn = new DataColumn();
            prixLiteraireColumn.DataType = Type.GetType("System.String");
            prixLiteraireColumn.ColumnName = "Prix Litéraire";
            recmpensesTable.Columns.Add(prixLiteraireColumn);

            return recmpensesTable;
        }

private void nouveauRecompense_Click(object sender, EventArgs e)
        {
            DataRow row = recompensesTable.NewRow();

            row[0] = ajoutRecompense.KeyWordAnnee;
            row[1] = ajoutRecompense.KeyWordPrixLiteraire;
            recompensesTable.Rows.Add(row);

            recompenseGridControl.DataSource = recompensesTable;
        }

【问题讨论】:

    标签: c# winforms gridview datatable devexpress


    【解决方案1】:

    在您的 Page_Load 中,您有 recompensesTable = MakeRecomponsesTable();。这会覆盖更改并重新创建数据表值

    在页面回发时,变量会恢复为默认值,需要重新创建。您可以使用 Session 来维护您的价值观

    private void AjoutLivre_Load(object sender, EventArgs e)
    {
       if(!Page.IsPostBack)
       {
         DataTable recompensesTable = MakeRecomponsesTable();
         Session["recompensesTable"] = recompensesTable; //Save it to session the first time
         recompenseGridControl.DataSource = recompensesTable;
       }
    }
    

    并检索会话保留值

    private void nouveauRecompense_Click(object sender, EventArgs e)
    {
        DataTable recompensesTable = (DataTable) Session["recompensesTable"]; //retrieve it from session
        DataRow row =  recompensesTable.NewRow();
    
        row[0] = ajoutRecompense.KeyWordAnnee;
        row[1] = ajoutRecompense.KeyWordPrixLiteraire;
        recompensesTable.Rows.Add(row);
    
        Session["recompensesTable"] = recompensesTable; //save it back to session
    
        recompenseGridControl.DataSource = recompensesTable;
    }
    

    【讨论】:

    • :: +1 很好的解释。 :)
    • 我认为是针对 Asp.Net 的,不是吗? '因为我正在开发一个 WinForm 应用程序
    • winforms 不使用gridview。它称为 DataGridView。你应该在你的问题中指出。下次添加相关信息
    • 在您的_click 事件中添加recompenseGridControl.DataBind()recompenseGridControl.DataSource = recompensesTable; 之后,看看情况如何
    • 如果你真的需要帮助,下次包括所有相关信息。一半的信息使人们猜测并拒绝潜在的答案
    【解决方案2】:

    改变你的

    private void AjoutLivre_Load(object sender, EventArgs e)
        {
          recompensesTable = MakeRecomponsesTable();
          recompenseGridControl.DataSource = recompensesTable;
        }
    

    private void AjoutLivre_Load(object sender, EventArgs e)
        {
          if(!IsPostback)
             recompensesTable = MakeRecomponsesTable();
          recompenseGridControl.DataSource = recompensesTable;
        }
    

    您还必须将数据表保存到会话

    【讨论】:

    • 我认为是针对 Asp.Net 的,不是吗? '因为我正在开发一个 WinForm 应用程序
    • 是的.. 但是 GeidView 仅在 asp.net 中可用,而在 winforms 中不可用。您是说 DataGeidView 吗?
    • 如果是这样。只需添加recompenseGridControl.DataBind()后,如果控件在nouveauRecompense_Click事件中指定数据源
    • “DevExpress.XtraGrid.GridControl”不包含“DataBind”的定义
    • 那么您应该在问题中正确指定标签,这将有助于我们为您提供任何解决方案。
    【解决方案3】:

    recmpensesTable 始终是一个新的 DateTable,您应该将其保存到会话中以备下次使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-02
      • 2014-09-11
      • 2014-03-19
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多