c#winform,串口接收完数据但在listview上没显示

时间:2021-02-02 00:56:13
步骤是这样,首先在TagSelect这个界面上点击扫描按钮,发送一条指令到串口 c#winform,串口接收完数据但在listview上没显示
然后在另一个cs文件里,串口返回数据,数据通过方法的调用又回到TagSelect界面 c#winform,串口接收完数据但在listview上没显示
最后在TagSelect界面把数据显示在listview上 c#winform,串口接收完数据但在listview上没显示
然后问题来了,这个listview里有数据,而且代码执行到这一步来了,但是listview里就是不显示数据

9 个解决方案

#1


公司的东西都加密了,图都发不出去..只能贴一些代码,这是第一步,在TagSelect这个界面上点击扫描按钮,发送一条指令到串口
if (btn_scanning.Text.Equals("扫描"))
            {
                listView1.Items.Clear();
                btn_scanning.Text = "停止";
                ReadWriteIO.order(Cmd.continuous, "00000000");//发送数据到串口
            }

#2


这是第二步,在另一个cs文件里,串口返回数据,数据通过方法的调用又回到TagSelect界面
int count = comm.BytesToRead;
                byte[] data = new byte[count];
                comm.Read(data, 0, count);//读取串口返回的数据

                TagSelect ts = new TagSelect();
                if (count > 0)
                {
                    ts.getdata(data);//调用TagSelect的方法将数据传过去
                }

#3


回到TagSelect这个界面,把数据显示到listview上
ListViewItem lvi = new ListViewItem();
                            lvi.Text = string.Join(" ", Regex.Matches(pc, @"..").Cast<Match>().ToList());
                            lvi.SubItems.Add(string.Join(" ", Regex.Matches(epc, @"..").Cast<Match>().ToList()));
                            lvi.SubItems.Add("1111111");
                            lvi.SubItems.Add("");
                            listView1.Items.Add(lvi);

#4


如果你的 comm.Read(data, 0, count); 方法是在 Received事件里的话  你要通过委才能访问UI线程  我的猜想哦

#5


查看你是否添加数据到listview里了

#6


如果你写
TagSelect ts = new TagSelect();
那么你创建了一个新的窗口,而且还没有 ts.Show(),你当然看不到。

#7


对于中高级的程序员(没办法,我们暂且把工作8个月以上、接受过培训的人认为是中级程序员吧),这是一个设计模式问题,就是在负责串口通讯的那个独立组件应该设计一个事件通知,比如
public event Action<string> 有消息到来啦;
然后窗口就好像使用普通的什么 TextBox 之类的控件一样地,注册事件处理方法,并且将参数中的消息内容(string 类型)传给自己的控件显示。

对于初级程序员,你可以在负责串口通讯的独立组件中尝试直接访问目标窗口。只不过这高度耦合,通讯组件再也不能当作独立服务而复用,其实是个反模式的设计。

#8


引用 4 楼 zmidl 的回复:
如果你的 comm.Read(data, 0, count); 方法是在 Received事件里的话  你要通过委才能访问UI线程  我的猜想哦
好像是这样的,你能详细说一下么,大佬有解决过这样的问题么。。。我看了一下委托,但是看不大明白

#9


引用 5 楼 u011017980 的回复:
查看你是否添加数据到listview里了
有数据的,我把这段代码放到其他地方,listview都能显示出来

#1


公司的东西都加密了,图都发不出去..只能贴一些代码,这是第一步,在TagSelect这个界面上点击扫描按钮,发送一条指令到串口
if (btn_scanning.Text.Equals("扫描"))
            {
                listView1.Items.Clear();
                btn_scanning.Text = "停止";
                ReadWriteIO.order(Cmd.continuous, "00000000");//发送数据到串口
            }

#2


这是第二步,在另一个cs文件里,串口返回数据,数据通过方法的调用又回到TagSelect界面
int count = comm.BytesToRead;
                byte[] data = new byte[count];
                comm.Read(data, 0, count);//读取串口返回的数据

                TagSelect ts = new TagSelect();
                if (count > 0)
                {
                    ts.getdata(data);//调用TagSelect的方法将数据传过去
                }

#3


回到TagSelect这个界面,把数据显示到listview上
ListViewItem lvi = new ListViewItem();
                            lvi.Text = string.Join(" ", Regex.Matches(pc, @"..").Cast<Match>().ToList());
                            lvi.SubItems.Add(string.Join(" ", Regex.Matches(epc, @"..").Cast<Match>().ToList()));
                            lvi.SubItems.Add("1111111");
                            lvi.SubItems.Add("");
                            listView1.Items.Add(lvi);

#4


如果你的 comm.Read(data, 0, count); 方法是在 Received事件里的话  你要通过委才能访问UI线程  我的猜想哦

#5


查看你是否添加数据到listview里了

#6


如果你写
TagSelect ts = new TagSelect();
那么你创建了一个新的窗口,而且还没有 ts.Show(),你当然看不到。

#7


对于中高级的程序员(没办法,我们暂且把工作8个月以上、接受过培训的人认为是中级程序员吧),这是一个设计模式问题,就是在负责串口通讯的那个独立组件应该设计一个事件通知,比如
public event Action<string> 有消息到来啦;
然后窗口就好像使用普通的什么 TextBox 之类的控件一样地,注册事件处理方法,并且将参数中的消息内容(string 类型)传给自己的控件显示。

对于初级程序员,你可以在负责串口通讯的独立组件中尝试直接访问目标窗口。只不过这高度耦合,通讯组件再也不能当作独立服务而复用,其实是个反模式的设计。

#8


引用 4 楼 zmidl 的回复:
如果你的 comm.Read(data, 0, count); 方法是在 Received事件里的话  你要通过委才能访问UI线程  我的猜想哦
好像是这样的,你能详细说一下么,大佬有解决过这样的问题么。。。我看了一下委托,但是看不大明白

#9


引用 5 楼 u011017980 的回复:
查看你是否添加数据到listview里了
有数据的,我把这段代码放到其他地方,listview都能显示出来