向DataTable添加新行

时间:2011-04-28 03:35:27

标签: c# wpf datatable

我有一个DataGrid绑定到一个数据库,有一个表和一个列(FooTable和FooName)。 使用以下代码,我可以将DataGrid绑定到DataTable并显示数据库数据。但是,每次我按DataSet_Add_Click()添加新行时,都不会向DataGrid添加任何内容。我虽然通过DataTableDataGrid绑定到ItemsSource,但是向DataTable添加新行不会向DataGrid添加行。为什么呢?

public partial class MainWindow : Window
{
    SqlCeConnection conn = new SqlCeConnection();

    /* Define the Connection String */
    string connString;
    DataGrid dg1 = new DataGrid();
    DataTable dt = new DataTable();

    public MainWindow()
    {
        InitializeComponent();

        connString = @"...";

        SqlCeConnection conn = new SqlCeConnection(connString);
        conn.Open();

        SqlCeDataAdapter da = new SqlCeDataAdapter();

        string sqlStr = @"SELECT * FROM FooTable";
        da.SelectCommand = new SqlCeCommand(sqlStr, conn);

        DataSet ds = new DataSet();
        da.Fill(ds, "FooTable");

        dt = ds.Tables["FooTable"];

        dg1.ItemsSource = ds.Tables;

        DataRow newRow = dt.NewRow();
        newRow["FooName"] = "Mary";
        dt.Rows.Add(newRow);

        CreateDataGrid();
    }

    public struct DataItem1
    {
        public string FooName { get; set; }
    }

    private void CreateDataGrid()
    {
        DataGridTextColumn col = new DataGridTextColumn();

        col = new DataGridTextColumn();
        col.Binding = new Binding("FooName");
        col.Header = "FooName";
        dg1.Columns.Add(col);

        /* dataGrid1 exist in XAML and is a parent of the DataGrid */
        dataGrid1.Children.Add(dg1);
    }

    private void DataSet_Add_Click(object sender, RoutedEventArgs e)
    {
        DataRow newRow2 = dt.NewRow();
        newRow2["FooName"] = "Mary";
        dt.Rows.Add(newRow2);
    }
}

4 个答案:

答案 0 :(得分:2)

请发布绑定Itemssource的xaml或cs代码。

您的DataSet_Add_Click是否将行添加到数据表中?如果是,那么它似乎只是数据网格的刷新/绑定问题。

当我使用datatables和datagrid时,我总是使用以下

//ctor or init
dt = ds.Tables["FooTable"];
//the next line you have to write after you initialize your datatable
this.MyView = (BindingListCollectionView)CollectionViewSource.GetDefaultView(this.dt);

XAML

<DataGrid ItemsSource="{Binding MyView }"/>

刷新

this.MyView.Refresh();

编辑: MyView是一个属性

public BindingListCollectionView MyView
{ 
   get {return this._myview;}
   set {this._myview = value; OnPropertyChanged("MyView");
}

你可以在代码中做绑定。

 Binding myBinding = new Binding("MyView");
 myBinding.Source = this;//the instance with the MyView property
 mydatagridctrl.SetBinding(ItemsControl.ItemsSourceProperty, myBinding);

答案 1 :(得分:1)

您好我在other thread编辑了我的答案。

使用数据表,datagrid和wpf / mvvm时使用的一般方法:

我总是将datagrid itemssource绑定到数据表的BindingListCollectionView。 我这样做是因为我可以轻松过滤,刷新或添加/删除/修改数据表项。

答案 2 :(得分:0)

尝试将此添加到DataSet_Add_Click方法

的末尾
dg1.Items.Refresh();

答案 3 :(得分:-1)

请在最后调用dt.DataBind();