有没有什么方法可以在不使用计时器的情况下每5或3秒刷新一次列表视图?

时间:2019-02-10 10:48:34

标签: c# sql-server winforms listview

我有一个正在另一台笔记本电脑上运行的表格,这是厨房一侧,在我的POS端(也正在另一台笔记本电脑上运行)购买后,所有订单都将通过。

现在,我在厨房一侧的列表视图在“使用计时器” 5秒后刷新,是否有任何选项或方法可以在不使用计时器的情况下刷新列表视图,因此当我在列表视图中选择一个项目时,“焦点”不会消失?

这是我的代码:

public Kitchen()
{
    InitializeComponent();

    listView2.Columns.Add("ORDERS", 800);

    listView2.View = View.Details;
    System.Windows.Forms.Timer timer_1 = new System.Windows.Forms.Timer();
    timer1.Interval = 5000;
    timer1.Tick += new System.EventHandler(timer1_Tick);
    timer1.Start();
} 

private void dinein(String tblnmber)
{
    String[] row = { tblnmber };

    listView2.Items.Add(new ListViewItem(row));
} 

public void loaddinein()
{
    listView2.Items.Clear();
    string sq = "select tblnmber as [ORDERS] FROM Kitchen Group By tblnmber";

    cmd = new SqlCommand(sq,con);

    try
    {
        con.Open();

        adp = new SqlDataAdapter(cmd);
        adp.Fill(dt);

        foreach (DataRow row in dt.Rows)
        {
            dinein(row[0].ToString());
        }

        con.Close();
        dt.Rows.Clear();
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
        con.Close();
    }
}  

private void timer1_Tick(object sender, EventArgs e)
{
    loaddinein();
}

3 个答案:

答案 0 :(得分:0)

将数据连续池到数据库服务器不是一个好方法,您可以选择两种方法之一。

  1. 使用触发器MSMQ发出更改消息,并订阅 MSMQ查看新消息。有关实现的更多详细信息,请参见 可以检查here
  2. 使用SqlDependency监视数据更改,有关更多详细信息,您可以检查here

注意:两种方法都有自己的优点/缺点。例如,如果侦听器的数量更多,则在这种情况下,SQL Dependency将影响性能。

答案 1 :(得分:0)

您的问题确实是如何在不更改顺序或焦点的情况下刷新现有项目列表? 与计时器有关的任何事情

要完成此操作,当再次从数据库中获取数据时,需要确定列表中哪些项已更改(将模型的文本与列表中的项进行比较),只需更新文本< / strong>。默认情况下,覆盖ListViewItem的Text属性不会更改选择/焦点或重新排序。

不要清除ListView并重新填充,否则焦点/选择将改变。

使用计时器仍然是完全有效的。

答案 2 :(得分:0)

大家好,我已经看过并阅读了一些教程,并实现了它,不幸的是sql依赖关系没有触发我的datagridview或listview。我还启用了代理。

这是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
//ALTER DATABASE HOB SET ENABLE BROKER
namespace DemoSQL
{
    public partial class Form1 : Form
    {
        public string m_connect = @"Data Source=DESKTOP-3B561M1;Initial Catalog=Users;Integrated Security=True";
        SqlConnection con = null;
        public delegate void NewHome();
        public event NewHome OnNewHome;
        public Form1()
        {
            InitializeComponent();
            try
            {
                SqlClientPermission ss = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
                ss.Demand();
            }
            catch (Exception)
            {

                throw;
            }
            SqlDependency.Stop(m_connect);
            SqlDependency.Start(m_connect);
            con = new SqlConnection(m_connect);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            OnNewHome+=new NewHome(Form1_OnNewHome);//tab
            //load data vao datagrid
            LoadData();
        }

        public void Form1_OnNewHome()
        {
            ISynchronizeInvoke i = (ISynchronizeInvoke)this;
            if (i.InvokeRequired)//tab
            {
                NewHome dd = new NewHome(Form1_OnNewHome);
                i.BeginInvoke(dd, null);
                return;
            }
            LoadData();

        }

        //Ham load data
        void LoadData()
        {
            DataTable dt = new DataTable();
            if (con.State==ConnectionState.Closed)
            {
                con.Open();
            }      

            SqlCommand cmd = new SqlCommand("SELECT FirstName,LastName from dbo.Uss", con);
            cmd.Notification = null;

            SqlDependency de = new SqlDependency(cmd);
            de.OnChange += new OnChangeEventHandler(de_OnChange);

            dt.Load(cmd.ExecuteReader(CommandBehavior.CloseConnection));
            dataGridView1.DataSource = dt;
        }
        public void de_OnChange(object sender, SqlNotificationEventArgs e)
        {
            SqlDependency de = sender as SqlDependency;
            de.OnChange -= de_OnChange;
            if (OnNewHome!=null)
            {
                OnNewHome();
            }
        }
    }
}