Наблюдаемая коллекция не обновляет сетку данных после linq - PullRequest
0 голосов
/ 31 января 2019

В моем приложении есть сетка данных и текстовое поле.Я предоставлю номер в текстовом поле, и после нажатия кнопки я хочу, чтобы сетка данных получала данные с данного номера.Источник данных сетки данных - это ObservableCollection.Проблема в том, что сетка данных не обновляется. Когда я нажимаю кнопку.

Я изучаю wpf.У меня есть сетка данных, которая является ObservableCollection.Данные для сетки данных заполняются с помощью SQL-запроса.Привязка к сетке данных работает отлично.Я искал в Интернете и обнаружил, что с помощью linq мы можем искать в коллекции и получать данные, но сетка данных не отражает никаких изменений.

ModelClasstab.Where(d => d.claimnumber == "123456712");

Выше я жестко закодировал данные текстового поля, чтобы проверить, работает ли условие

Window.xaml

<Label Width="69" Height="23.277" HorizontalAlignment="Left" Margin="1,-10,30,0" VerticalAlignment="Top" Content="From Date"/>
<TextBox HorizontalAlignment="Left" Width="113" Height="19.277"  Margin="-200,1,-228.962,0"  x:Name="txtboxComments"/>
<Button  Command="{Binding dataSearch}" Margin="300,-20,30,0" Width="60" Height="23.277"  Content="Search"></Button>
<DataGrid x:Name="datagrid" ItemsSource="{Binding ModelClasstab}" AutoGenerateColumns="True" CanUserAddRows="False" Height="350" Width="365" Margin="5" HorizontalAlignment="Left"/>

ViewModel.cs:

   public class ViewModel
  {
    public RelayCommand dataSearch { get; set; }
    public ObservableCollection<tabpageAuditInformationModel> ModelClasstab {get; set;} 


    public ViewModel()
  {   
    FillList();
    dataSearch = new RelayCommand(o => Search());
  }

 public void Search()
    { 
     ModelClasstab.Where(d => d.claimnumber == "123456712");
    }


public void FillList()
    {
        string connectionString = "Data Source=192.168.6.102; Initial Catalog=Operations Productivity Tool;Integrated Security=SSPI;";

        string sql = "SELECT distinct Date_Audited as Date , claimNumber as 
 claimnumber,Audit_id,[Start Time],[End Time],[Total Time] as 
 [Total_time_taken(Mins)] , [Final Status] as finalstatus " +
" FROM dbo.[opcod Audit Information]" +
            //or date = dateadd(day,-1,cast(getdate() as date))) " +"where userName = 'rengar2' ";

        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (var command = new SqlCommand(sql, connection))
            {

                try
                {


                    adapter = new SqlDataAdapter(command);
                    ds = new DataSet();
                    adapter.Fill(ds, "tblCountries");

                    if (ModelClasstab == null)
                        ModelClasstab = new ObservableCollection<tabpageAuditInformationModel>();

                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        var month = Convert.ToDateTime(dr[0]).Month;
                        var year = Convert.ToDateTime(dr[0]).Year;
                        var day = Convert.ToDateTime(dr[0]).Day;


                        ModelClasstab.Add(new tabpageAuditInformationModel
                        {
                            claimnumber = dr[1].ToString(),
                            Date = string.Format("{0}/{1}/{2}", month, day, year),
                            Starttime = dr[3].ToString(),
                            EndTime = dr[4].ToString(),
                            TotalTime = dr[5].ToString()
                        });


                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        }
    }
     }  

Model.Cs

 public class tabpageAuditInformationModel
  {
   public String Date
   { get; set; }


   public String claimnumber
   { get; set; }

   public String Starttime
   { get; set; }

   public String EndTime
   { get; set; }

   public String TotalTime
   { get; set; }

}

Редактировать: после прочтения комментариев я присвоил значение переменной, удалил все элементы в коллекции и добавил в список только выбранные данные.Здесь я не могу запустить два foreach одновременно.Точка останова вообще не входит во второй цикл.Я не уверен в своем подходе.Дайте мне знать, если есть какой-либо лучший подход.

         var d1 = ModelClasstab.Where(d => d.claimnumber == "123456712");
                    foreach (var a1 in ModelClasstab.ToList())
                        ModelClasstab.Remove(a1);
                    foreach (var a in d1.ToList())
                        ModelClasstab.Add(new tabpageAuditInformationModel
                        {
                            claimnumber = a.claimnumber,
                            Date = a.Date,
                            Starttime = a.Starttime,
                            EndTime = a.EndTime,
                            TotalTime = a.TotalTime
                        });

                }

1 Ответ

0 голосов
/ 31 января 2019

С предложением Collection.Where вы не изменяете коллекцию, поэтому вы не видите никаких изменений в DataGrid.
Одна из многих возможностей - сохранить данные вашей БД в некоторой переменной и установить вSearch свойство ModelClasstab:

public void Search()
{
    ModelClasstab=new ObservableCollection<tabpageAuditInformationModel>(DbData.Where(d => d.claimnumber == "123456712"));
}

Для такого способа ModelClasstab не обязательно должен быть ObervableCollection и (!) Ваш ViewModel должен реализовать INotifyPropertyChanged.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...