在winform中(c#2008),用数组传递数据行给子窗体乱套了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在winform中(c#2008),用数组传递数据行给子窗体乱套了相关的知识,希望对你有一定的参考价值。

1、在主窗体,我有datagridview里面现实很多数据行,假设如下
表头(字段名):A B C D E F G H I J
数据行1: a b c d e f g h i j
......
我用数组dataOFrow[]用来把一行的各列数据一次存起来:
for (int i = 0; i < dataOFrow.Length; i++)

dataOFrow[i] = dr.Cells[i+1].Value.ToString();



双击某一行时,将这个数组传递给子窗体便于更加直观的显示(原来的一行数据太长,不便于查看)

2、在子窗体,接收到了这个数组,但是我把数组的每一列一次显示在一系列文本框之后,数据的顺序错乱了(有一部分对的),比如成了以下情况:

A a
B b
C e
D c
E d
F f
G g
H h
I i
J j

我这一行的数据很多,查出来发现有好几处顺序发生错乱,这是为什么呢?我按顺序存入数组,有按顺序取出来显示的啊?
这是主窗体,看到没?

参考技术A 建议你不要这样用,既然你已经用到了DataGridView,并且绑定了这些数据的列。
你可以把选中行的DataRow直接传到子窗体,子窗体通过row["字段名"]的方式来访问数据,这样无论将来DataGridView的列排列顺序如何变更,只要字段名没有变化,就不需要对程序进行修改。

可以用下面方法取到选中的DataGridView行对应的DataTable中的DataRow

DataRowView drv = dataGridView1.SelectedRows[0].DataBoundItem as DataRowView;
DataRow dr = drv.Row;
参考技术B 我觉得可能是你中间排序错误了,你可以这样,不需要把行里的数据给数组,你直接用取当前datagridview的已选择行号,然后用datagridview1.rows[行号].cells["列名"]来取值,这样比较稳妥,因为涉及到序号的问题一般不知道意义,错误概率就会加大,你用列名取值,不管他什么顺序都不会乱,你试试吧。我一直这样用,没错过。本回答被提问者采纳 参考技术C 肯定顺序排错了 参考技术D winform是啥东西啊! 第5个回答  2010-06-30 无代码无真相

如何在 c++ winform 中的线程之间传递数据?

【中文标题】如何在 c++ winform 中的线程之间传递数据?【英文标题】:how to pass data between threads in c++ winform? 【发布时间】:2021-08-17 21:05:54 【问题描述】:

在这个程序中,我想用一个线程捕获我的网络摄像头的帧,然后将这些帧发送到另一个名为 MainThread 的帧,并在图片框中显示网络摄像头

所以我想将捕获的帧 (_frame1) 从 capture_frame_1_Thread 传递到 MainThread。 有什么想法吗?

这里是代码

    VideoCapture cap1(0);
    Mat _frame1;

    void capture_frame_1() 
    for (;;) 
        cap1 >> _frame1;

        if (waitKey(1) == 27) 
            break;
        
    


void invoke_capture_frame_1() 
    Invoke(gcnew System::Action(this, &MyForm::capture_frame_1));


void start_picture_Boxes() 
    for (;;) 

        mat2picture bimapconvert;
        this->pictureBox1->Image = bimapconvert.Mat2Bimap(_frame1);

        pictureBox1->Refresh();

        if (waitKey(1) == 27) 
            break;
        
    


void picture_Boxes() 
    Invoke(gcnew System::Action(this, &MyForm::start_picture_Boxes));




private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)

ThreadStart^ ThreadMethod1 = gcnew ThreadStart(this, &MyForm::invoke_capture_frame_1);
Thread^ capture_frame_1_Thread = gcnew Thread(ThreadMethod1);

ThreadStart^ ThreadMethod3 = gcnew ThreadStart(this, &MyForm::picture_Boxes);
Thread^ MainThread = gcnew Thread(ThreadMethod3);

capture_frame_1_Thread->Start();
MainThread->Start();



;

【问题讨论】:

【参考方案1】:

您可以创建一个名为 webcam 的类,并拥有这些方法。然后你可以有一些方法来启动线程 webcam.startThreads();。 然后你可以创建一个叫做frame的私有变量,这样你就可以在线程之间共享,但不要忘记使用锁来消除竞争条件。 锁信息https://www.cplusplus.com/reference/mutex/mutex/lock/

希望对你有帮助,我在制作网络过滤器时使用了这个结构。

【讨论】:

考虑在答案中添加示例代码

以上是关于在winform中(c#2008),用数组传递数据行给子窗体乱套了的主要内容,如果未能解决你的问题,请参考以下文章

C#winform 如何点击按钮将listbox中的数据删除,SQL 2008中的数据也删除

水晶报表的打印预览,是在visual studio2008中做的,C#WinForm做的

C# WinForms 用鼠标拖动控件

如何在 c++ winform 中的线程之间传递数据?

语言C#,winform,数据库为access. 如何把int数组作为sql语句中的查询条件?

C#winform中数据列表显示(急)