从另一个窗口(Class)问题调用方法

时间:2010-01-10 17:13:52

标签: c# wpf generics

在WPF应用程序主窗口的代码隐藏文件中,我有一个方法,使用LINQ to SQL查询数据库并将结果写入ObservableCollection:

    public void GetStateByDate(string shcode)
    {
        MydbDataContext contextSts = new MydbDataContext();
        _ShAvaQuCollection.Clear();

        var sts = from p in contextSts.SAties where p.ShID == shcode select p;

        foreach (var p in sts)
            _ShAvaQuCollection.Add(new ShAvaQu
            {
                ShCode = p.ShID,
                SiID = p.SiID,
                PrCat = p.PrCat
            });
    }

当我从文件后面的相同代码(同一窗口)调用此方法时,一切正常。

如果我从另一个窗口调用此方法,使用主窗口的instanse,ObservableCollection仍为空。:

SWindow sw = new SWindow();
sw.GetStateByDate(stringpar);

这是什么原因?在这种情况下,方法是否创建了另一个ObservableCollection实例?

(我可以在调试器中看到sw._ShAvaQuCollection包含值。sw._ShAvaQuCollection_ShAvaQuCollection的收集时间是否相同?如果是,可以如何解决?)

已编辑(已添加)

ObservableCollection以这种方式声明:

    ObservableCollection<ShAvaQu> _ShAvaQuCollection =
            new ObservableCollection<ShAvaQu>();

    public ObservableCollection<ShAvaQu> ShAvaQuCollection
    { get { return _ShAvaQuCollection; } }

    public class ShAvaQu
    {
        public string ShCode { get; set; }
        public string SiID { get; set; }
        public int PrCat { get; set; }
    }

我从一个窗口调用该方法,其中另一个集合ShQuCollection通过ListView显示。在SelectionChanged事件处理程序中,我为此数据库查询获取一个参数:

private void ShSelList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {           
        SWindow sw = new SWindow();         
        string str = sw.ShQuCollection[ShSelList.SelectedIndex].ShCode;
        sw.GetStateByDate(str);
        Close();
    }
}

1 个答案:

答案 0 :(得分:2)

1)最重要的是,您不应该从Windows /窗体调用数据库逻辑。你应该把它抽象成另一个类。然后你可以让你的方法返回一个可观察的集合。

但是在您的情况下,我假设您正在尝试使用辅助表单重新加载/加载集合,并且您希望它在主表单上使用。这样做的问题是您正在创建表单的新实例,因此正在填充您的集合,但不是在主表单上而是副本。

有几种方法可以尝试解决这个问题。

1)使方法静态,将可观察集合设为静态,以便更新单个实例。

2)将主表单的实例句柄传递到辅助表单,以便重新使用已有的实例。这样做更为可取,因此您不会在整个地方创建新实例。

在第二种形式的构造函数中,您可以传入主窗口的实例,然后可以直接使用它。这应该可以解决你的问题。

更新:这是一些代码示例。基本上有很多方法可以传递引用。

您可以使用构造函数执行此操作:

// This is the constructor for your second window
private Window _parentHandle;

public SecondWindow(Window obj)
{
    this._parentHandle = obj;
}

然后从具有该方法的主窗体开始,就像这样打开该窗口。

SecondWindow w = new SecondWindow(this);
w.Show();

现在,您的第二个窗口可以直接处理第一个窗口,因此您可以在该变量上调用方法,它将更新。

另一种方法是在第二个窗口上使用公共Setter方法。

public Window ParentContext
{
   get { return this._parentHandle; }
   set { this._parentHandle = value; }
}

然后你可以像这样创建你的表单实例:

SecondWindow w = new SecondWindow();  // so just like normal
w.ParentContext = this; // set the instance to the calling form
w.Show();

这是基础知识。这种类型的场景适用于您需要传递引用的任何场景。

希望有所帮助。