2013-04-29 59 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(); 

    }