软件开发-C# 多窗口之间动态传值问题

问题描述

C# 多窗口之间动态传值问题

我在做一个串口接收数据并处理的小软件,在主窗口接收并处理后在TextBox上输出,为了直观的显示数据变化,所以再开一个窗口显示波形。
我采用public类传递数值,为了方便测试,我还顺便传了一个随机数,结果每次随机数传过去了,串口的数据没有传过去。
把随机数生成放在接收事件中一样传递不过去。

传递参数的Public类。

public int[] tranTest()
{
        Random rd = new Random();

        int[] TranArr = new int[4];
        if (SpeedR1.Count > 0)
        {
                TranArr[0] = SpeedR1[SpeedR1.Count - 1];
                TranArr[1] = SpeedR2[SpeedR2.Count - 1];
                TranArr[2] = SpeedSU[SpeedSU.Count - 1];
        }
        TranArr[3] = rd.Next(0, 400);
        return TranArr;
}

数据接收和处理

int count = 0;
Byte[] TFrame = new Byte[20];
int CountData = 0;
Byte Flag = 0;

private List<int> SpeedR1 = new List<int>();
private List<int> SpeedR2 = new List<int>();
private List<int> SpeedSU = new List<int>();
private List<int> SpeedAc = new List<int>();
private List<int> Reli = new List<int>();

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

        Byte[] data = new Byte[serialPort1.BytesToRead];
        Byte[] Cdata = new Byte[1024*10];
        string RecieveData="";
        serialPort1.Read(data, 0, data.Length);  //读取串口数据

        for (int i = 0; i < data.Length; i++)
        {
                //RecieveData = RecieveData + BitConverter.ToString(data[i], 16) + " ";
                Cdata[CountData++] = data[i];

        }

        RecieveData =  BitConverter.ToString(data).Replace("-"," ")+" ";

        Thread DealData = new Thread(new ThreadStart(dealStr));
        if (CountData >= 15)
        {
                int Temp=0;
                for (int j = 0; j < CountData - 2; j++)
                {
                        if (Cdata[j] == 0xF3 && Cdata[j + 1] == 0xF4)
                        {
                                Flag = 1;
                                Temp = j;
                                break;
                        }
                }
                if (Flag == 1)
                {
                        for (int t = 0; t < 15 && Temp + t < CountData; t++)
                                TFrame[count++] = Cdata[Temp + t];
                        if (count >= 15)
                        {
                                count = 0;
                                Flag = 0;
                                DealData.Start();
                        }

                }
                CountData = 0;
        }

        TxtRec.Invoke(new Action(() => { TxtRec.AppendText(RecieveData); }));

}

public void dealStr()
{
        if (TFrame[2] == 1)
                SpeedR1.Add(TFrame[3] * 256 + TFrame[4]);
        else
                SpeedR1.Add((TFrame[3] * 256 + TFrame[4]) * (-1));

        if (TFrame[5] == 1)
                SpeedR2.Add(TFrame[6] * 256 + TFrame[7]);
        else
                SpeedR2.Add((TFrame[6] * 256 + TFrame[7]) * (-1));

        if (TFrame[8] == 1)
                SpeedSU.Add(TFrame[9] * 256 + TFrame[10]);
        else
                SpeedSU.Add((TFrame[9] * 256 + TFrame[10]) * (-1));

        if (TFrame[11] == 1)
                SpeedAc.Add(TFrame[12]);
        else
                SpeedAc.Add(TFrame[12] * (-1));

        Reli.Add (TFrame[13]);

        //tranTest();

        string Speed1 = SpeedR1[SpeedR1.Count-1].ToString();
        if (Speed1[0] != '0')
        {
                int Count1 = Speed1.Length;
                Speed1 = Speed1.Insert(Count1 - 2, ".");
        }
        string Speed2 = SpeedR2[SpeedR2.Count-1].ToString();
        if (Speed2[0] != '0')
        {
                int Count1 = Speed2.Length;
                Speed2 = Speed2.Insert(Count1 - 2, ".");
        }

        string Speed_S = SpeedSU[SpeedSU.Count-1].ToString();
        if (Speed_S[0] != '0')
        {
                int Count1 = Speed_S.Length;
                Speed_S = Speed_S.Insert(Count1 - 2, ".");
        }
        string Acc_Speed = SpeedAc[SpeedAc.Count-1].ToString();
        if (Acc_Speed[0] != '0')
        {
                int Count1 = Acc_Speed.Length;
                if(Count1==1)
                        Acc_Speed = Acc_Speed.Insert(Count1 - 1, "0.");
                else
                        Acc_Speed = Acc_Speed.Insert(Count1 - 1, ".");
        }
        string Reliability = Reli[Reli.Count-1].ToString() + "%";

        R1Speed.Invoke(new Action(() => { R1Speed.Clear(); R1Speed.AppendText(Speed1); }));
        R2Speed.Invoke(new Action(() => { R2Speed.Clear(); R2Speed.AppendText(Speed2); }));
        SumSpeed.Invoke(new Action(() => { SumSpeed.Clear(); SumSpeed.AppendText(Speed_S); }));
        AccSpeed.Invoke(new Action(() => { AccSpeed.Clear(); AccSpeed.AppendText(Acc_Speed); }));
        ReBility.Invoke(new Action(() => { ReBility.Clear(); ReBility.AppendText(Reliability); }));

}

窗口2中获取数据类有个定时器,定时获取。

MainForm frm = new MainForm();
int[] DrawL1 = new int[1024 * 1024];
int[] DrawL2 = new int[1024 * 1024];
int[] DrawL3 = new int[1024 * 1024];
int[] TestDraw = new int[1024 * 1024];
int DCount=0;

private void GetData()
{

        int[] Tran=frm.tranTest();
        DrawL1[DCount] = Tran[0];
        DrawL2[DCount] = Tran[1];
        DrawL3[DCount] = Tran[2];
        TestDraw[DCount] = Tran[3];

        DCount++;
}

一直在做C的嵌入式编程,现在要自己写一些测试软件和配套软件所以刚开始学C#,求各位大神指点。

解决方案

参考这个

C#多窗口之间传值的两种方法—实例介绍

http://blog.sina.com.cn/s/blog_3d4c358f0100kezv.html

或者用静态变量来实现

解决方案二:

参考我的帖子
http://bbs.csdn.net/topics/360140208

解决方案三:

if (SpeedR1.Count > 0)这句是否为真?

解决方案四:

public class MainForm
{
public static List list = new ArrayList();

//方法对list赋值

}

public class SubForm
{
MainForm frm = new MainForm();

//方法取值
private void getList()
{
    List<int> list = frm.list;
}

}

解决方案五:

学习学习,遇到过类似的问题

时间: 2025-01-21 09:15:22

软件开发-C# 多窗口之间动态传值问题的相关文章

C#实现窗口之间的传值

  本文给大家介绍的是C#中利用静态类和静态变量来实现窗口间传值的方法和示例,非常的实用,有需要的小伙伴可以参考下. 为了解决在多个窗口之间的传值问题,我们可以通过设置静态类和静态变量的办法来实现窗口间值的传递 窗体一代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 //窗体1的代码 using System; using System.Collections.G

JavaScript新窗口与子窗口之间的传值

 这篇文章主要介绍了JavaScript新窗口与子窗口之间的传值,需要的朋友可以参考下 window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+  window.open(pageURL,name,parameters)  pageURL 为子窗口路径  name 弹出窗口的名字  parameters 为窗口参数(各参数用逗号分隔)  alwaysLowered | yes/no | 指定窗口隐藏在所有窗口之后  alwa

winform开发俩个窗口之间数据库共享问题

问题描述 请问下我有A窗口,B窗口,然后在A窗口里面有一个已经充填好的表DTABLE,B窗口引用这个DTABLE,怎么共享,也就是两个窗口共享数据库 解决方案 解决方案二:BS?CS?1.CS在A窗口将这个datatable声明为public,B窗口可以直接调用了aaa=newa()a.datatable2.BS:没法直接调用,要存为中间的东西,在A里面保存在SESSION,再从B调用或从数据库再调用一次解决方案三:共享数据表吧.让你的A或B窗体都继承一个带数据提取的父窗体.或者把dtable放

软件开发质量控制研究

[摘要]本文指出了软件开发过程中质量控制的重要性,通过分析开发过程中存在的问题,提出了一些提高软件开发质量的方法的对策措施. [关键词]软件开发:软件工程:质量控制 软件质量是指开发出来的软件不仅可以满足客户明确提出来的要求还要满足某些没有明确提出来的要求,软件质量越高,客户需求满足度就越高.软件项目质量控 制不仅仅是控制软件设计的最终结果,它其实要求贯穿于软件设计项目的全过程,从软件开发初期的客户需求调查,到最终的软件交付评审,每个阶段都要进行仔细 的控制,才能提高软件开发的质量. 一.软件开

c#窗体-c#两个窗口之间传值,虽然简单,但我仍不会,请各位大神帮忙

问题描述 c#两个窗口之间传值,虽然简单,但我仍不会,请各位大神帮忙 在一个窗口的button按钮中点击,另一个窗口的checkbox被选中,该咋写 解决方案 http://bbs.csdn.net/topics/360140208 解决方案二: 另一个窗体添加一个属性 public bool IsSelected { get { return checkBox1.Checked; } set { checkBox1.Checked = value; } } 主窗体 (Application.O

mfc c++-MFC中不同的窗口之间传值的问题

问题描述 MFC中不同的窗口之间传值的问题 在MFC单文档程序中,新建一个对话框,对话框中一个有几个单选按钮.给单选按钮定义一个变量m_PenStyle用来确定选择了哪个单选按钮.然后在View类里面定义一个变量PenStyle,我想让m_PenStyle的值传递给PenStyle,但是运行时发现传递不过来,怎么才能传递到View类里面? 解决方案 每个单选按钮不是有个ID么?用ID就行了,还要什么其他标识来追踪.

请问各位商业上的人事,java软件开发用的是Swing可视化窗口开发还是用class类开发

问题描述 请问各位商业上Java的人事,java软件开发用的是Swing可视化窗口开发还是用class类开发.请说明从软件的安全与保密性,用那个比较好. 解决方案 解决方案二:java的长处不在界面开发上,商用的Java桌面成功的还没看到过.(免费的不说了)商业java应用,多半是后台服务器应用,所以是用class直接开发.软件安全方面,Java也不是强项.Java程序的安全性,通常是用操作系统保证的,操作系统被攻破了,把class文件反编译一下,基本都出来了.要是你要做安全性很高的桌面应用,建

应届毕业生在企业erp与j2ee软件开发之间如何选择?

问题描述 个人背景A掌握的技能:jsp,servlet,spring,struts,Hibernate能够使用ssh集成框架开发一些简单的信息系统.B本人所学专业介绍:信息管理与信息系统是一个比较综合的专业,有一半的经济管理类的课程,一半的软件开发类的课程.C自我评价:逻辑思维能力强,在信息系统开发中有较强的创造力.编程能力突出.学习能力好:当前的选择:如果有两个选择:一个是去海马参与企业erp的开发,可能是签约三年:另一个是到福建新大陆软件公司做j2ee程序员.个人的分析:1.我觉得对于我来说

软件开发的那些事儿:解决之道

前面提出了软件开发的轮回:期望--破灭--崩溃--新的轮回,我们的解决之道在哪里呢? 我的反思--不在沉默中爆发,就在沉默中灭亡 反思,我在反思-- 对于来自客户的变更,我永远忘不了的是大学时老师的谆谆教导.上软件工程课的时候,老师总是一再地反复强调,一定要将需求变更消灭在需求分析阶段.按照过去的瀑布式开发理论的描述,总是要求我们在需求分析阶段了解清楚客户的所有需求,并编写成<软件需求说明书>,交给客户签字.客户一旦在<软件需求说明书>上签字,那么需求就不能再更改了,软件就照这个开