gpt4 book ai didi

c# - 在 WPF 中重新加载绑定(bind)到 Datagrid 的 DataTable

转载 作者:行者123 更新时间:2023-11-30 17:54:29 24 4
gpt4 key购买 nike

我想在我的 WPF 数据网格中显示一个 SQL 表,在运行时编写 SQL 查询。我已经构建了我的 View (简化)和关联的 ViewModel:

查看:

----------------MyDataGrid.xaml----------------

<DataGrid x:Name="CurrentSqlGrid" 
ItemsSource="{Binding Path=CurrentDataTable,Mode=OneWay}"
Grid.Row="2" AutoGenerateColumns="True" IsReadOnly="True" />
<TextBox x:Name="TextBoxSql" Height="120" Grid.Row="1"
TextWrapping="Wrap" VerticalAlignment="Top"/>

----------------MyDataGrid.cs----------------

public partial class MyDataGrid : UserControl
{
private SqlDataGridViewModel sqlDataGridViewModel;

public MyDataGrid()
{
InitializeComponent();
sqlDataGridViewModel = new SqlDataGridViewModel();
this.DataContext = sqlDataGridViewModel;
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
sqlDataGridViewModel.FillDataTableWithQuery(TextBoxSql.Text);
}
}

View 模型:

----------------SqlDataGridViewModel.cs----------------

public class SqlDataGridViewModel 
{
private DataTable _dataTable;
private SqlDataAdapter _adapter;

public DataTable CurrentDataTable
{
get
{
return _dataTable;
}
set
{
_dataTable = value;
}
}

public SqlDataGridViewModel()
{
_dataTable = new DataTable("QUERY");
FillDataTableWithQuery("SELECT TOP 500 * FROM XUSER");
}

public void FillDataTableWithQuery(string query)
{
CurrentDataTable.Reset();
CurrentDataTable.Clear();

try
{
using (SqlConnection sqlConn = new SqlConnection(SessionProvider.Instance.currentConnectionString))
{
_adapter = new SqlDataAdapter(query, sqlConn);
_adapter.Fill(CurrentDataTable);
}
}
catch (Exception ex)
{
MartuLogger.Instance.Error("Exception in SqlDataGridViewModel :" + ex.Message);
}
}
}

此解决方案显示第一个查询的第一个数据表。

但是当我编写另一个 SQL 查询时,我调用了 FillDataTableWithQuery("SELECT * from another_table") 并且 Datagrid 清除了所有行但它不加载新列和新行! (只显示旧列!)。在调试中,CurrentDataTable 包含新查询的结果....有什么想法吗?

解决方案在 Faisal Hafeez 的帮助下,我们找到了这个解决方案:

Xaml 和code behind 是一样的。它适用于 OneWay 和 TwoWay 模式。

我的 View 模型变成了:

public class SqlDataGridViewModel : INotifyPropertyChanged
{
private DataTable _dataTable;
private SqlDataAdapter _adapter;
public event PropertyChangedEventHandler PropertyChanged;

protected void NotifyPropertyChange(string PropertyName)
{
PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
}

public DataTable CurrentDataTable
{
get
{
return _dataTable;
}
set
{
_dataTable = value;
//NotifyPropertyChange("CurrentDataTable");
}
}

public SqlDataGridViewModel()
{
_dataTable = new DataTable("QUERY");
FillDataTableWithQuery("SELECT TOP 500 * FROM XUSER");
}

public void FillDataTableWithQuery(string query)
{
_dataTable = new DataTable("QUERY");

try
{
using (SqlConnection sqlConn = new SqlConnection(SessionProvider.Instance.currentConnectionString))
{
_adapter = new SqlDataAdapter(query, sqlConn);
_adapter.Fill(CurrentDataTable);
}

NotifyPropertyChange("CurrentDataTable");
}
catch (Exception ex)
{
MartuLogger.Instance.Error("Exception in SqlDataGridViewModel :" + ex.Message);
}
}
}

如果我在 _adapter.Fill 之后不 NotifyPropertyChange,则 View 不会刷新。 (我试图在 Set CurrentTable 中进行通知,但 _adapter.Fill 显然不调用 CurrentTable 的 set 方法)。谢谢。

最佳答案

试试这个。您需要实现 INotifyPropertyChanged 并在数据网格的设置事件上调用 PropertyChanged。

公共(public)类 SqlDataGridViewModel : INotifyPropertyChanged{

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}

public DataTable CurrentDataTable
{
get
{
return _dataTable;
}
set
{
_dataTable = value;
OnPropertyChanged("CurrentDataTable");
}
}
}

关于c# - 在 WPF 中重新加载绑定(bind)到 Datagrid 的 DataTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16016777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com