C # DataGrid ไม่เต็มเมื่อถูกเรียกจากคลาสอื่น

ฉันมี DataGrid ในแอปพลิเคชัน wpf ของฉัน DataGrid นี้ถูกเติมจาก DataSet เมื่อฉันเรียกวิธีการของฉัน Aktualizuj() ทุกอย่างทำงานได้ดี ปัญหาคือเมื่อใดก็ตามที่ฉันเรียกมันจากคลาสอื่น มันจะทริกเกอร์ แต่ DataGrid ยังคงไม่เปลี่ยนแปลง

ชั้นเรียนหลักหลัก

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();

และจากตรงนี้ผมเรียก Aktualizuj()

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 มีแถวเดียวกันที่โหลดจาก DB เช่นเดียวกับในกรณีทำงานหรือไม่

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