Существуют ли способы обновления списка каждые 5 или 3 секунды без использования таймера? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть форма, которая работает на другом ноутбуке, это кухонная сторона, через которую будут проходить все заказы после покупки в моей POS (которая также работает на другом ноутбуке).

Теперь мой список просмотра со стороны кухни обновляется через 5 секунд, «используя таймер», есть ли какие-либо варианты или способы обновления списка без использования таймера, чтобы «Фокус» при выборе элемента внутриlistview не исчезнет?

Это мой код:

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 голосов
/ 10 февраля 2019

Ну, на самом деле ваш вопрос как обновить существующий список элементов без изменения порядка или фокуса? не как-то связано с таймерами .

Для этого при повторном получении данных из БД необходимо определить, какие элементы изменились в списке (сравнить текст вашей модели с элементом в списке), и просто обновить текст . из этих предметов.Перезапись свойства ListViewItem Text не изменит выделение / фокус или изменение порядка по умолчанию.

Не очистить ListView и заполнить заново, иначе фокус / выбор изменится.

Таймер все еще идеально подходит для использования.

0 голосов
/ 11 февраля 2019

Привет, ребята, я уже смотрел и читал некоторые учебные пособия, и реализую их, к сожалению, зависимость sql не запускается ни для моего представления данных, ни для просмотра списка.Я также включил брокера.

Это код:

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();
            }
        }
    }
}
0 голосов
/ 10 февраля 2019

Постоянный пул к серверу БД не является хорошим подходом, вы можете выбрать любой из двух подходов.

  1. Поднять сообщение об изменении с помощью триггера на MSMQ и подписаться на MSMQ для новых сообщений.Для более подробной информации о реализации вы можете проверить здесь
  2. Отслеживание изменений данных с помощью SqlDependency, для более подробной информации вы можете проверить здесь

Примечание: оба подхода имеют свои плюсы и минусы.Например, если число слушателей больше, в этом случае зависимость от SQL снизит производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...