如何获取对象类的新实例?

时间:2014-03-19 09:01:28

标签: c# wpf

首先,我的编程概念并不是很好,所以我甚至不确定我的问题是否有正确的选择。无论如何,这是我面临的问题:

private void gridCommsEqp_OnSelectionChanged(object sender, SelectionChangeEventArgs e)
{
    var temp = (CommsEqp) gridCommsEqp.SelectedItem;
    var commItems = new List<CommsItem>(issueAdapt.getCommsItemsByEqpID(temp.EqpID));
}

这里我试图通过我的DataGrid根据所选的装备(只能选择一个)获得正确的Comms Item。每次选择更改时,它都会更新与该装备相对应的新项目集。

这是我的“getCommsItemsByEqpID”方法:

public IEnumerable<CommsItem> getCommsItemsByEqpID(int eqpID)
{
    DataTable commItem = issueTransactions.getCommsItemsByEqpID(eqpID);
    var listCommsItems = new List<CommsItem>((from DataRow row in commItem.Rows 
                                             select new CommsItem((int)row["ItemID"], 
                                            (string)row["cardNO"], 
                                            (string)row["serial"])).ToList());
    return listCommsItems;
}

问题是,每次选择更改时,我的代码将继续添加到列表中,而不是获取新实例。因此,例如,在通过多次单击datagrid的不同行来讨论选择之后,我将获得一个包含之前选择的所有行的多个equipID的列表。我该如何避免这种情况?

虽然我可以立即分配列表,但我尝试创建新实例以查看它是否有帮助,如上所示。我还认为“select new CommsItem”将创建一个对象类的新实例,因此不会保留以前的记录。但它仍然会给我一个以前所有项目的综合列表。

提前感谢您的帮助!

编辑:按要求显示更多代码

public DataTable getCommsItemsByEqpID(int eqpID)
    {
        var sqlString = String.Format("SELECT ItemID, cardNo, 
                                   serial FROM tblCommsItem WHERE EqpID = {0}", eqpID);
        establishDB(sqlString);
        ad.Fill(ds, "CommsItems");
        conn.Close();
        return ds.Tables["CommsItems"];
    }

private void establishDB(string sqlString)
    {
        command.CommandText = sqlString;
        conn = connectDB();
        ad.SelectCommand = command;
        command.Connection = conn;
    }

private static SqlConnection connectDB()
    {
        var conn = new SqlConnection();
        string connString = ConfigurationManager.ConnectionStrings["SecureDB"].ToString();
        conn.ConnectionString = connString;
        conn.Open();
        return conn;
    }

编辑2:显示更多代码:

private void gridCommsEqp_OnSelectionChanged(object sender, SelectionChangeEventArgs e)
    {
        var temp = (CommsEqp) gridCommsEqp.SelectedItem;

            var commItems = new List<CommsItem>(issueAdapt.getCommsItemsByEqpID(temp.EqpID));
            if (commItems[0].CardNO == "" && commItems[0].Serial == "")
            {
                gridCommsItem.Columns.Clear();
                gridCommsItem.MaxColumnWidth = Double.PositiveInfinity;
                var gridColumn = new GridViewColumn{Header = "This item is not serialized. You can directly select the quantity.", Width = gridCommsItem.Width - 50, HeaderTextAlignment = TextAlignment.Center};
                gridCommsItem.Columns.Add(gridColumn);
                gridCommsItem.ShowGroupPanel = false;
                gridCommsItem.IsEnabled = false;
            }

    }

1 个答案:

答案 0 :(得分:0)

我怀疑的问题可能是您在每次填充之前没有清除DataSet和DataTable中的数据。在将数据填充到DataSet之前,请清除DataSet和DataTable中的内容。

原因是这一行:

ad.Fill(ds, "CommsItems");

在此处设置调试器断点。每次点击后您都会看到更多的累积记录。