2013-04-29 56 views
0

通过说我在wpf中使用c#开始,所以我在我的主窗口(SalesScreen)中有一个列表框的新问题。我有一个名为SearchScreen的窗口,它有一个从sql server上的表填充的数据网格。现在我的目标是能够从此数据网格中选择一行,然后单击一个表示“添加到购物车”的按钮。单击此按钮时,它将成功将所选行发送到正在主窗口上填充Listbox的新表。请记住两个窗口同时保持打开状态。所以我遇到的问题是当服务器上tblCart变化时,ListBox不会自动更新。有关如何做到这一点的任何建议?我再一次在c#的初学者阶段。从sql server表中更新另一个窗口上的列表框,c#wpf

这是我的XAML启动列表框(只是一个基本的列表框):

<ListBox Height="261" HorizontalAlignment="Left" Margin="43,69,0,0" Name="listBox1" VerticalAlignment="Top" Width="240"/> 

这是用于改变文本框上SalesScreen(主窗口)的方法。当文本框更改事件发生时,该行被添加到服务器,并且窗口中的ListBox被正确更新。我试图用“添加到购物车”按钮点击这个事件,但它没有改变。现在,如果我使用SearchScreen上的“Add to Cart”按钮,然后回到主窗口并执行textboxchanged事件,它将更新添加的两个项目。

public void addtoList() 
    { 
     cn.Open(); 
     String cmdString = "Select Title, Price from tblCart"; 
     SqlCommand cmd = new SqlCommand(cmdString, cn); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     double subT = 0; 
     double tax = 1.09; 
     double total = 0; 
     while (dr.Read()) 
     { 
      int count = dr.FieldCount - 1; 
      for (int i = 0; i < count; i++) 
      { 

       listBox1.Items.Add(dr["Title"].ToString() + dr["Price"].ToString()); 
       subT += Convert.ToDouble(dr["Price"]); 

      } 

     } 
     total = subT * tax; 
     subTotal.Text = subT.ToString(); 
     totalBlk.Text = total.ToString(); 
     cn.Close(); 
    } 

这是addtoCart按钮:

private void addBtn_Click(object sender, RoutedEventArgs e) 
    { 
     SalesScreen ss = new SalesScreen(); 

     DataRowView drView = (DataRowView)dGrid.SelectedItem; 
     String s = Convert.ToString(drView.Row["ID"]); 
     String cmdString = "INSERT INTO tblCart(Title, GenreID, Price, Year, UML, Quantity) Select Title, GenreID, Price, Year, UML, Quantity FROM tblMovies WHERE ID = " + s; 
     SqlCommand cmd = new SqlCommand(cmdString, cn); 
     cmd.ExecuteNonQuery(); 

     ss.addtoList(); 
    } 

所以基本上,我可以使用TextChanged事件从同一个窗口更新它,但是当它涉及到从一个窗口发送到另一个我这一挑战最不成功。任何建议将不胜感激。

+0

在您的按钮单击事件有当执行你的命令没有打开的连接。 – Derek 2013-04-29 15:18:31

+0

当时连接已经打开,但我确实尝试过,但是刚刚告诉我连接从未关闭。 – Shawn 2013-04-29 15:22:37

+0

只有在需要时,才应该打开连接。每个连接都应该打开并在完成后尽快处理。您可以使用Using Statement(自动封装和关闭连接)或使用Try/Catch语句来捕获任何异常。在finally语句中,关闭连接。 – Derek 2013-04-29 15:34:40

回答

0

修改你的点击按钮事件

private void addBtn_Click(object sender, RoutedEventArgs e) 
{ 
    SalesScreen ss = new SalesScreen(); 

    DataRowView drView = (DataRowView)dGrid.SelectedItem; 
    String s = Convert.ToString(drView.Row["ID"]); 
    String cmdString = "INSERT INTO tblCart(Title, GenreID, Price, Year, UML, Quantity) Select Title, GenreID, Price, Year, UML, Quantity FROM tblMovies WHERE ID = " + s; 
    SqlCommand cmd = new SqlCommand(cmdString, cn); 
    cmd.CommandType = CommandType.Text; 
    cn.Open(); 
    cmd.ExecuteNonQuery(); 
    cn.Close(); 
    ss.addtoList(); 
} 
+0

因此,我只关闭了所有连接,所以我可以像这样做,使用cn.Open和cn.Close处理ExecuteNonQuery之前和之后,但仍然没有任何结果。当我退出SearchScreen窗口时,列表框仍然不会在SalesScreen窗口上更新。这是我过去几天的生活;)。感谢您的时间来回应。 – Shawn 2013-04-29 15:35:49

+0

所以这就是我所做的解决这个问题。当点击按钮进入SearchScreen时,我关闭了SalesScreen。当我点击SearchScreen上的后退按钮返回到SalesScreen时,我将addtoList()方法放在与InitializeComponent()相同的方法中;它效果很好。一种刷新。 – Shawn 2013-05-01 03:21:08

0
public SalesScreen() 
    { 
     InitializeComponent(); 
     addtoList(); 

    }