【问题标题】:Updating a ListBox on another window from sql server table, c# wpf从sql server表更新另一个窗口上的ListBox,c#wpf
【发布时间】:2013-04-29 15:06:17
【问题描述】:

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

这是我启动 ListBox 的 xaml(只是一个基本的 ListBox):

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

这是一种用于在 SalesScreen(主窗口)上更改的文本框的方法。当文本框更改事件发生时,该行被添加到服务器并且列表框在窗口中正确更新。我尝试通过单击“添加到购物车”按钮来调用此事件,但它没有任何变化。现在,如果我使用 SearchScreen 上的“添加到购物车”按钮,然后返回主窗口并执行 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();
    }

这是添加到购物车按钮:

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 事件从同一个窗口更新它,但是在将它从一个窗口发送到另一个窗口时,我在这个挑战中最不成功。任何建议将不胜感激。

【问题讨论】:

  • 在您的按钮单击事件中,执行命令时没有打开连接。
  • 此时连接已经打开,我确实尝试过以确保,但只是告诉我连接从未关闭。
  • 你不应该打开连接,只有在需要时才可以。每个连接都应在完成后立即打开和处理。您可以使用 Using 语句来执行此操作,其中连接被封装并自动关闭,或者您应该使用 Try/Catch 语句来捕获任何异常。在 finally 语句中,您关闭连接。

标签: c# sql-server wpf listbox


【解决方案1】:

修改你的点击按钮事件

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

【讨论】:

  • 所以,我刚刚关闭了所有连接,所以我可以这样做,在 ExecuteNonQuery 之前和之后使用 cn.Open 和 cn.Close,但仍然没有。当我退出 SearchScreen 窗口时,列表框不会在 SalesScreen 窗口上更新。这就是我过去几天的生活;)。也感谢您抽出时间回复。
  • 这就是我为解决这个问题所做的。当单击按钮转到 SearchScreen 时,我关闭了 SalesScreen。当我点击 SearchScreen 上的后退按钮返回到 SalesScreen 时,我将 addtoList() 方法放在与 InitializeComponent() 相同的方法中;而且效果很好。一种刷新。
【解决方案2】:
public SalesScreen()
    {
        InitializeComponent();
        addtoList();

    }

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多