С# DataGrid не заполняется при вызове из другого класса

У меня есть сетка данных в моем приложении wpf. Эта сетка данных заполняется из DataSet. Когда я вызываю свой метод Aktualizuj(), все работает нормально. Проблема в том, что всякий раз, когда я вызываю его из другого класса, он срабатывает, но сетка данных остается неизменной.

Основной основной класс

namespace MenadzerTicketow
{
    public partial class MainWindow : MetroWindow
    {
            public void Aktualizuj()
        {
            try
            {
                //Some Code
                string selectStr = ("select * from " + aktywnatabela + " order by id desc");
                SQLiteDataAdapter myAdapter = new SQLiteDataAdapter(selectStr, Start.m_dbConnection);
                DataSet dset = new DataSet();
                int i = myAdapter.Fill(dset);
                dataGrid.ItemsSource = dset.Tables[0].DefaultView;
                //MessageBox.Show(dset.GetXml().ToString()); //DataSet is being filled correctyl, thats not a case
                //Some
                //Code
            }
            catch (SQLiteException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

Я добавил код ниже, но проблема не исчезла.

 dataGrid.ItemsSource = null;
 dataGrid.Items.Refresh();

И отсюда я звоню Актуализуй()

namespace MenadzerTicketow
{
    public partial class SDMWindow : MetroWindow
    {
        //Some Code

        private void button_Click(object sender, RoutedEventArgs e)
        {
            var p = new MainWindow();
            p.Aktualizuj();
            p.Close();
            this.Close();
        }
    }
}

Спасибо за помощь.


person Rasiel    schedule 04.01.2017    source источник
comment
Пожалуйста, объясните вашу проблему более подробно. Например, какое у вас MainWindow и откуда вы открываете SDMWindow и т.д.   -  person DT sawant    schedule 04.01.2017
comment
SDMWindow открывается в MainWindow кнопкой `SDMWindow win4 = new SDMWindow(); win4.Show();` Моя проблема в том, что Aktualizuj() при вызове из SDMWindow работает нормально, но dataGrid остается неизменным.   -  person Rasiel    schedule 04.01.2017


Ответы (3)


Следующая строка кода создает новый экземпляр MainWindow:

var p = new MainWindow();

Поскольку вы никогда не вызываете для него метод Show(), вы никогда его не увидите.

Чтобы затронуть DataGrid в уже открытом экземпляре вашего MainWindow, вам нужно получить ссылку на этот конкретный экземпляр окна и вызвать для него метод Aktualizuj(). Вы можете использовать коллекцию Application.Current.Windows, чтобы получить ссылку на окно:

private void button_Click(object sender, RoutedEventArgs e)
{
    MainWindow p = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
    if (p != null)
        p.Aktualizuj();

    this.Close();
}

Или вы можете использовать Application.Current.MainWindow при условии, что окно на самом деле является главным окном вашего приложения:

private void button_Click(object sender, RoutedEventArgs e)
{
    MainWindow p = Application.Current.MainWindow as MainWindow;
    if (p != null)
        p.Aktualizuj();

    this.Close();
}
person mm8    schedule 04.01.2017
comment
Большое спасибо :) Это сработало, и теперь я понимаю проблему. - person Rasiel; 05.01.2017

Ваша переменная aktywnatabela одинакова в обоих случаях? Поскольку это MainWindow, то, вероятно, все действия по инициализации выполнены, но есть ли в объекте DataSet те же строки, загруженные из БД, что и в рабочем случае?

person Rafichu    schedule 04.01.2017
comment
Да, aktywnatabela то же самое, но я думаю, что это не важно, потому что с набором данных все в порядке (я проверил это с помощью MessageBox.Show(dset. GetXml (). ToString ()); ). Строки набора данных должны измениться, когда я вызываю метод Aktualizuj() с помощью кнопки, расположенной в основном классе, тогда добавляются новые строки . После вызова из другого класса я вижу, что dsetсодержит новые данные, поэтому, вероятно, проблема где-то еще. - person Rasiel; 04.01.2017

Пожалуйста, попробуйте этот подход, который я использую для управления родительским окном из дочернего окна. Надеюсь, это поможет..

foreach (Window win in Application.Current.Windows.OfType<MainWindow>())
    {
        var mainWin = ((MainWindow)win);
        mainWin.Aktualizuj();
    }
person Kay Lee    schedule 04.01.2017