ListView中的自动刷新数据 [英] Auto Refresh data in ListView

查看:46
本文介绍了ListView中的自动刷新数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用ABB PC for C#进行项目。我正在连接到我的网络中的机器人控制器,并希望显示有关机器人的信息,并希望读取变量的值。目前,我可以通过双击一个显示的机器人控制器来扫描机器人控制器并读取
所需的信息。问题是,显示的数据不会刷新。因此,要刷新信息,我必须再次在控制器上单击。现在的目标是使用双击一次将
连接到机器人控制器,然后自动刷新数据,例如每隔一秒左右。这可能是使用C#,你能帮助我实现吗?直到现在我发现这可以通过使用DataGridView实现,但由于我对C#完全是新的
,我在实现此功能时遇到了很多问题。


代码I '使用:

使用System; 
使用System.Collections.Generic;使用System.ComponentModel
;
使用System.Data;使用System.Drawing
;
使用System.Text;
使用System.Windows.Forms;

使用ABB.Robotics.Controllers;
使用ABB.Robotics.Controllers.Discovery;
使用ABB.Robotics.Controllers.RapidDomain;
使用ABB.Robotics.Controllers.IOSystemDomain;

命名空间WindowsFormsApp1
{
public partial class Form1:Form
{
private NetworkScanner networkScanner = null;
private Controller ctrl = null;
private Controller controller = null;
private Task [] tasks = null;
private NetworkWatcher networkwatcher = null;
private Num rapidNum;
private double VarValue = 0;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender,EventArgs e)
{
networkScanner = new NetworkScanner();
networkScanner.Scan();
ControllerInfoCollection controllers = networkScanner.Controllers;
networkwatcher = new NetworkWatcher(networkScanner.Controllers);

networkwatcher.Found + = new EventHandler< NetworkWatcherEventArgs>(HandleFoundEvent);
networkwatcher.Lost + = new EventHandler< NetworkWatcherEventArgs>(HandleLostEvent);
networkwatcher.EnableRaisingEvents = true;

foreach(控制器中的ControllerInfo控制器)
{
ListViewItem item = new ListViewItem(controller.IPAddress.ToString());
item.SubItems.Add(controller.Id);
item.SubItems.Add(controller.Availability.ToString());
item.SubItems.Add(controller.IsVirtual.ToString());
item.SubItems.Add(controller.SystemName);
item.SubItems.Add(controller.Version.ToString());
item.SubItems.Add(controller.ControllerName);
item.Tag = controller;
this.listControllersView.Items.Add(item);
}
}

private void Form1_Closed(object sender,FormClosedEventArgs e)
{
this.networkwatcher.Lost - = new EventHandler< NetworkWatcherEventArgs>( HandleLostEvent);
this.networkwatcher.Found - = new EventHandler< NetworkWatcherEventArgs>(HandleFoundEvent);
}

private void ListControllersView_DoubleClick(object sender,EventArgs e)
{
ListViewItem itemView = listControllersView.SelectedItems [0];

if(itemView.Tag!= null)
{
ControllerInfo controllerInf =(ControllerInfo)itemView.Tag;

if(controllerInf.Availability == ABB.Robotics.Controllers.Availability.Available)
{
if(this.controller!= null)
{
this.controller.Logoff();
this.controller.Dispose();
this.controller = null;
}

this.controller = ControllerFactory.CreateFrom(controllerInf);
this.controller.Logon(UserInfo.DefaultUser);

RapidData rd = this.controller.Rapid.GetRapidData(" T_ROB1"," RoboDK_Driver"," TESTVAR");

if(rd.Value is Num)
{
rapidNum =(Num)rd.Value;
VarValue = rapidNum.Value;
}

ListViewItem item = new ListViewItem(controller.RobotWare.ToString()+"" + controller.State.ToString()+"" + controller.OperatingMode.ToString ()+"" +" VarValue" +"" + VarValue);
this.listOutput.Items.Add(item);
}
else
{
MessageBox.Show(" Selected controller not available");
}
}
}

void HandleFoundEvent(对象发送者,NetworkWatcherEventArgs e)
{
this.Invoke(new
EventHandler< NetworkWatcherEventArgs>(AddControllerToListView),
new Object [] {this,e});
}

void HandleLostEvent(对象发送者,NetworkWatcherEventArgs e)
{
this.Invoke(new EventHandler< NetworkWatcherEventArgs>(RemoveControllerFromListView),
new Object [] {sender,e});
}

private void AddControllerToListView(object sender,NetworkWatcherEventArgs e)
{
ControllerInfo controllerInfo = e.Controller;
ListViewItem item = new ListViewItem(controllerInfo.IPAddress.ToString());
item.SubItems.Add(controllerInfo.Id);
item.SubItems.Add(controllerInfo.Availability.ToString());
item.SubItems.Add(controllerInfo.IsVirtual.ToString());
item.SubItems.Add(controllerInfo.SystemName);
item.SubItems.Add(controllerInfo.Version.ToString());
item.SubItems.Add(controllerInfo.ControllerName);
item.Tag = controllerInfo;
this.listControllersView.Items.Add(item);
}

private void RemoveControllerFromListView(object sender,NetworkWatcherEventArgs e)
{
foreach(this.listControllersView.Items中的ListViewItem项)
{
if((ControllerInfo)item.Tag == e.Controller)
{
this.listControllersView.Items.Remove(item);
休息;
}
}
}
}
}

解决方案

您好,


您可以在Windows窗体应用中使用计时器,定义一个Timer并设置定时器间隔:

定时器定时器; 
public Form1()
{
InitializeComponent();
timer = new Timer();
timer.Interval = 1000;
timer.Tick + = Timer_Tick;
}

并将刷新代码放入Timer_Tick事件中:

 private void Timer_Tick(object sender,EventArgs e)
{
//将刷新代码放在这里
}

最后,启动计时器,如ListView_DoubleClick事件:

 timer.Start(); 

有关Winform中Timer的详细信息,请参阅以下文档: / p>

Timer
Class


C#计时器


此致,


Stanly


注意:此响应包含对第三方万维网站点的引用。 Microsoft提供此信息是为了方便您。 Microsoft不控制这些网站,也未测试在这些网站上找到的任何软件或信息;因此,
Microsoft不能就其中发现的任何软件或信息的质量,安全性或适用性做出任何陈述。使用互联网上的任何软件都存在固有的危险,微软提醒您在从互联网上检索任何软件之前,确保您完全了解风险。


I'm working on a project with the ABB PC SDK for C#. I'm connecting to a robot controller in my network and want to display information about the robot and want to read the value of a variable. Currently I'm able to scan for the robot controllers and read the desired information by double clicking on one displayed robot controller. The problem is, that the data shown, aren't refreshed. So to refresh the information I have to click again on the controller. The goal now is to use the double click once to connect to the robot controller and then automatically refresh the data, for example every second or so. Is this possible using C# and if could you help me achieving that? Till now i found that this could be possible by using DataGridView, but since I'm totally new to C# I got a lot of problems implementing this functionality.

The code I'm using:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    using ABB.Robotics.Controllers;
    using ABB.Robotics.Controllers.Discovery;
    using ABB.Robotics.Controllers.RapidDomain;
    using ABB.Robotics.Controllers.IOSystemDomain;

    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            private NetworkScanner networkScanner = null;
            private Controller ctrl = null;
            private Controller controller = null;
            private Task[] tasks = null;
            private NetworkWatcher networkwatcher = null;
            private Num rapidNum;
            private double VarValue = 0;

            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                networkScanner = new NetworkScanner();
                networkScanner.Scan();
                ControllerInfoCollection controllers = networkScanner.Controllers;
                networkwatcher = new NetworkWatcher(networkScanner.Controllers);

                networkwatcher.Found += new EventHandler<NetworkWatcherEventArgs>(HandleFoundEvent);
                networkwatcher.Lost += new EventHandler<NetworkWatcherEventArgs>(HandleLostEvent);
                networkwatcher.EnableRaisingEvents = true;

                foreach (ControllerInfo controller in controllers)
                {
                    ListViewItem item = new ListViewItem(controller.IPAddress.ToString());
                    item.SubItems.Add(controller.Id);
                    item.SubItems.Add(controller.Availability.ToString());
                    item.SubItems.Add(controller.IsVirtual.ToString());
                    item.SubItems.Add(controller.SystemName);
                    item.SubItems.Add(controller.Version.ToString());
                    item.SubItems.Add(controller.ControllerName);
                    item.Tag = controller;
                    this.listControllersView.Items.Add(item);
                }
            }

            private void Form1_Closed(object sender, FormClosedEventArgs e)
            {
                this.networkwatcher.Lost -= new EventHandler<NetworkWatcherEventArgs>(HandleLostEvent);
                this.networkwatcher.Found -= new EventHandler<NetworkWatcherEventArgs>(HandleFoundEvent);
            }

            private void ListControllersView_DoubleClick(object sender, EventArgs e)
            {
                ListViewItem itemView = listControllersView.SelectedItems[0];

                if(itemView.Tag != null)
                {
                    ControllerInfo controllerInf = (ControllerInfo)itemView.Tag;

                    if(controllerInf.Availability == ABB.Robotics.Controllers.Availability.Available)
                    {
                        if(this.controller != null)
                        {
                            this.controller.Logoff();
                            this.controller.Dispose();
                            this.controller = null;
                        }

                        this.controller = ControllerFactory.CreateFrom(controllerInf);
                        this.controller.Logon(UserInfo.DefaultUser);

                        RapidData rd = this.controller.Rapid.GetRapidData("T_ROB1", "RoboDK_Driver", "TESTVAR");

                        if (rd.Value is Num)
                        {
                            rapidNum = (Num)rd.Value;
                            VarValue = rapidNum.Value;
                        }

                        ListViewItem item = new ListViewItem(controller.RobotWare.ToString() + " " + controller.State.ToString() + " " + controller.OperatingMode.ToString() + " " + "VarValue" + " " + VarValue);
                        this.listOutput.Items.Add(item);
                    }
                    else
                    {
                        MessageBox.Show("Selected controller not available");
                    }
                }
            }

            void HandleFoundEvent(object sender, NetworkWatcherEventArgs e)
            {
                this.Invoke(new
                EventHandler<NetworkWatcherEventArgs>(AddControllerToListView),
                new Object[] { this, e });
            }

            void HandleLostEvent(object sender, NetworkWatcherEventArgs e)
            {
                this.Invoke(new EventHandler<NetworkWatcherEventArgs>(RemoveControllerFromListView),
                new Object[] { sender, e });
            }

            private void AddControllerToListView(object sender, NetworkWatcherEventArgs e)
            {
                ControllerInfo controllerInfo = e.Controller;
                ListViewItem item = new ListViewItem(controllerInfo.IPAddress.ToString());
                item.SubItems.Add(controllerInfo.Id);
                item.SubItems.Add(controllerInfo.Availability.ToString());
                item.SubItems.Add(controllerInfo.IsVirtual.ToString());
                item.SubItems.Add(controllerInfo.SystemName);
                item.SubItems.Add(controllerInfo.Version.ToString());
                item.SubItems.Add(controllerInfo.ControllerName);
                item.Tag = controllerInfo;
                this.listControllersView.Items.Add(item);
            }

            private void RemoveControllerFromListView(object sender, NetworkWatcherEventArgs e)
            {
                foreach(ListViewItem item in this.listControllersView.Items)
                {
                    if((ControllerInfo)item.Tag == e.Controller)
                    {
                        this.listControllersView.Items.Remove(item);
                        break;
                    }
                }
            }
        }
    }

解决方案

Hi,

You can use a Timer for your purpose in Windows Forms app, define a Timer and set the timer interval:

    Timer timer;
    public Form1()
    {
        InitializeComponent();
        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += Timer_Tick;
    }

And put your refresh code into the Timer_Tick event:

    private void Timer_Tick(object sender, EventArgs e)
    {
        //put your refresh code here
    }

Finally, start the timer somewhere like ListView_DoubleClick event:

    timer.Start();

Refer to the following documents for more details about Timer in Winform:

Timer Class

C# Timer

Regards,

Stanly

Note: This response contains a reference to a third party World Wide Web site. Microsoft is providing this information as a convenience to you. Microsoft does not control these sites and has not tested any software or information found on these sites; Therefore, Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information found there. There are inherent dangers in the use of any software found on the Internet, and Microsoft cautions you to make sure that you completely understand the risk before retrieving any software from the Internet.


这篇关于ListView中的自动刷新数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆