我有兩個數據表「ResultData」和「OutputData」。其中一個接收來自sql查詢的結果,另一個我手動添加行。用戶界面不通過NotifyPropetyChanged更新數據表
ResultData從查詢中獲取結果,適當地更新UI。但是OutputData不。我將鏈接下面的整個方法。我一直堅持這一段時間,它似乎是由於它是異步造成的,但我不知道如何解決它。下面是構造函數和方法
class SqlInterfaceViewModel : INotifyPropertyChanged
{
private IDBQuery connection;
private string sql;
private DataTable resultData;
private DataTable outputData;
public ButtonViewModel Bvm;
private string resultStatus;
private bool queryRunning;
private string elapsedTime;
private int sqlCount;
public event PropertyChangedEventHandler PropertyChanged;
public SqlInterfaceViewModel(IDBQuery connection)
{
this.connection = connection;
outputData = new DataTable();
outputData.Columns.Add("DateTime", typeof(string));
outputData.Columns.Add("Action", typeof(string));
outputData.Columns.Add("Message", typeof(string));
outputData.Columns.Add("Duration", typeof(string));
Bvm = new ButtonViewModel(new ButtonModel(new Action(executeSql)));
OutputData.RowChanged += new DataRowChangeEventHandler(Row_Changed);
}
public bool QueryRunning
{
get { return queryRunning; }
set
{
if (value != this.queryRunning)
{
queryRunning = value;
OnPropertyChanged("QueryRunning");
}
}
}
public string Sql
{
get { return sql; }
set
{
if (sql != value)
sql = value;
OnPropertyChanged("Sql");
}
}
public DataTable ResultData
{
get { return resultData; }
set
{
if (resultData != value)
resultData = value;
OnPropertyChanged("ResultData");
}
}
public DataTable OutputData
{
get { return outputData; }
set
{
if (outputData != value)
outputData = value;
OnPropertyChanged("OutputData");
}
}
public string ResultStatus
{
get { return resultStatus; }
set
{
if (resultStatus != value)
resultStatus = value;
OnPropertyChanged("ResultStatus");
}
}
private void Row_Changed(object sender, DataRowChangeEventArgs e)
{
OnPropertyChanged("OutputData");
}
private List<string> sqlList(string sql)
{
List<string> SqlList = sql.Split(';').ToList();
return SqlList;
}
public async void executeSql()
{
foreach (string statement in sqlList(sql))
{
QueryRunning = true;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
DateTime dateTime = DateTime.Now;
try
{
sw.Start();
if (statement.ToUpper().Contains("SELECT"))
ResultData = await connection.GetResultSetTask(statement);
else
sqlCount = await connection.ExecuteUpdate(statement);
sw.Stop();
elapsedTime = sw.Elapsed.ToString(@"hh\:mm\:ss\.ffff");
if (statement.ToUpper().Contains("SELECT"))
OutputData.Rows.Add(dateTime.ToString(), statement, ResultData.Rows.Count.ToString() + " rows selected", elapsedTime);
else if (statement.ToUpper().Contains("UPDATE"))
OutputData.Rows.Add(dateTime.ToString(), statement, sqlCount.ToString() + " rows updated successfully", elapsedTime);
else if (statement.ToUpper().Contains("INSERT"))
OutputData.Rows.Add(dateTime.ToString(), statement, sqlCount.ToString() + " rows inserted successfully", elapsedTime);
else if (statement.ToUpper().Contains("DELETE"))
OutputData.Rows.Add(dateTime.ToString(), statement, sqlCount.ToString() + " rows deleted successfully", elapsedTime);
else
OutputData.Rows.Add(dateTime.ToString(), statement, sqlCount.ToString() + " records affected", elapsedTime);
}
catch (Exception ex)
{
OutputData.Rows.Add(dateTime.ToString(), sql, sqlCount.ToString() + " records affected", elapsedTime);
}
finally
{
QueryRunning = false;
}
}
}
public void OnPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(
this, new PropertyChangedEventArgs(propName));
}
}
我有雙重檢查我的DataTable特性以及綁定在XAML無一不是設置相同。
該方法的ExecuteSQL正在通過ICommand的
public class ButtonViewModel {
private bool canExecute;
private ICommand clickCommand;
private ButtonModel model;
public ICommand ClickCommand { get { return clickCommand ?? (clickCommand = new CommandHandler(() => ClickAction(), canExecute)); } }
public string ImageUriString { get { return UriStringFactory.GetUriString(model.ImageUriString); } }
public string HoverText { get { return model.HoverOverText; } }
public ButtonViewModel(ButtonModel model) {
canExecute = true;
this.model = model;
}
public void ClickAction() {
model.CommandAction();
}
}
internal class CommandHandler : ICommand {
public event EventHandler CanExecuteChanged;
private readonly Action action;
private readonly bool canExecute;
public CommandHandler(Action action, bool canExecute) {
this.action = action;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter) {
return canExecute;
}
public async void Execute(object parameter) {
await Task.Run(action);
}
}
我的解決方案,我想這是從事件觸發解決了這個問題?你可以顯示事件聲明以及如何調用'executeSql()'? – sellotape
也有可能你的更新/插入語句包含文本「選擇」;例如「insert dbo.table1(column1)select 42」? – sellotape
應該指出的是,如果我點擊其中一個列標題,那麼datagrid會在那時更新......我已經爲我的類以及buttonviewmodel添加了構造函數。 –