• 【winform】主窗体多线程给子窗体传值


    参考:C# winform窗体间传值(使用委托或事件)

    0.委托窗体传值

    1.主窗体多线程给子窗体传值(多线程)

    解决方案:主要使用委托,因为会出现跨线程错误
    主窗体

            public FormMain()
            {
                InitializeComponent();
    
                //background thread running
                Action sAction = async () => await CallbackWorkItem();
                System.Threading.Tasks.Task task = System.Threading.Tasks.Task.Run(sAction);
                System.Threading.Tasks.Task.WaitAll(task);
            }
    
    
    
    
            private async Task CallbackWorkItem()
            {
                List<string> filesGuidList = new List<string>(); //the GUID to download
               
    
                while (true)
                {
                    try
                    {
                         int count = int.Parse(COUNT);
    
                        if (string.IsNullOrWhiteSpace(DOWNPATH))
                        {
                            MessageBox.Show("the config's key for DOWNPATH is empty.");
                            return;
                        }
    
                        if (!string.IsNullOrWhiteSpace(PROJECTID) && !string.IsNullOrWhiteSpace(HOID))
                        {
                            filesGuidList.Clear();
    
                            //1.Check
                            bool checkTask = await CheckIds(Guid.Parse(PROJECTID), Guid.Parse(HOID));
    
                            if (checkTask)
                            {
                                deliveryFile.SetMonitor(deliveryFile,"download begins.", COUNT);
                                //2.Load
                                var files = await LoadDeliveryFiles(Guid.Parse(PROJECTID), Guid.Parse(HOID), TEMPKEY, count);
    
                                if (count == 1)
                                {
                                    deliveryFile.SetMonitor(deliveryFile,$"download the data: {files[0].Name}", COUNT);
                                }
                                else
                                {
                                    deliveryFile.SetMonitor(deliveryFile,$"download the {COUNT} data.", COUNT);
                                }
    
    
                                foreach (var file in files)
                                {
                                    filesGuidList.Add(file.Guid.ToString());
                                }
    
    
                                string fileZipName = string.Empty;
                                //3.download
                                if (DownloadFile(Guid.Parse(PROJECTID), filesGuidList, out fileZipName))
                                {
                                    DeleteRedis(Guid.Parse(PROJECTID), filesGuidList, fileZipName, TEMPKEY);
                                    deliveryFile.SetMonitor(deliveryFile,"end of download.", COUNT);
                                }
                            }
                            else
                            {
                                deliveryFile.SetMonitor(deliveryFile,"no download data.", COUNT);
                               await Task.Delay(1000);
                            }
                        }
                        deliveryFile.SetMonitor(deliveryFile,"rest 7 seconds...", COUNT);
    
                        await Task.Delay(7000);
    
                    }
                    catch (FormatException e)
                    {
                        MessageBox.Show("the config's key for PROJECTID or HOID must be GUID,and COUNT must be number.");
                        await Task.Delay(60000); //if throw exception,re-execute after 60 seconds
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message);
                        await Task.Delay(60000); //if throw exception,re-execute after 60 seconds
                    }
                }
            }
    

    FileDeliveryFile.cs

    public partial class FormDeliveryFile : Form
    {
    	public delegate void FileUpdateStatus(Control control, string monitor, string count);
    }
    
    public void SetMonitor(Control control, string monitor, string count)
            {
    
                if (control.InvokeRequired)
                {
                    //direct access to controls across threads-跨线程直接访问控件 - InvokeRequired
                    FileUpdateStatus update = new FileUpdateStatus(SetMonitor);
                    control.Invoke(update, new object[] { control, monitor, count });
    
    
                }
                else
                {
                    this.txtMonitor.Text = monitor;
                    this.txtMonitorSetCount.Text = count;
                    this.txtMonitor.ForeColor = Color.Brown;
                    this.txtMonitorSetCount.ForeColor = Color.Brown;
    
    
                    this.dataGridView1.DataSource = LoadPath();
                    this.dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;  //自适应列宽
                    this.dataGridView1.Columns[1].DefaultCellStyle = new DataGridViewCellStyle() { ForeColor = Color.Blue, Font = new Font("Arial", 11F) }; //样式
                    this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                    this.dataGridView1.ReadOnly = true;
                    if (this.dataGridView1.FirstDisplayedScrollingRowIndex > -1)
                    {
                        this.dataGridView1.FirstDisplayedScrollingRowIndex = VerticalScrollIndex;//设置垂直滚动条位置
    //                    this.dataGridView1.CurrentCell = this.dataGridView1.Rows[rowIndex].Cells[0];
                    }
                }
    
            }
    

    2.datagridview 滚动时位置不变

    if (this.dataGridView1.FirstDisplayedScrollingRowIndex > -1)
                    {
                        this.dataGridView1.FirstDisplayedScrollingRowIndex = VerticalScrollIndex;//设置垂直滚动条位置
                        this.dataGridView1.CurrentCell = this.dataGridView1.Rows[rowIndex].Cells[0];
                    }
    

    Scroll事件

     private void dataGridView1_Scroll(object sender, ScrollEventArgs e)
            {
                try
                {
                    if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)
                    {
                        VerticalScrollIndex = e.NewValue;
                    }
                    else if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)
                    {
                        HorizontalOffset = e.NewValue;
                    }
    
                }
                catch { }
            }
    

    3.datagridview 第1列点击打开文件并选择文件夹位置

    		private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
    			//第1列
                if (e.ColumnIndex == 1)
                {
                    string file = DOWNPATH + this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                    System.Diagnostics.Process.Start(file); //打开文件
                    //string v_OpenFolderPath = DOWNPATH; 
                    System.Diagnostics.Process.Start("explorer.exe", "/select," + file); //打开后选择文件
                    //this.dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
    
                }
            }
    

    4.鼠标移动到文字上显示"hand"按钮

          private void dataGridView1_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
            {
    
                this.Cursor = Cursors.Default;
            }
    
            private void dataGridView1_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
            {
                if (e.ColumnIndex == 1)
                {
                    this.Cursor = Cursors.Hand;
                }
            }
    

    5.安全性问题,System.UnauthorizedAccessException异常

    Advanced Installer打包Winform后安装在C盘权限不足的解决方法

    解决方法:

    (1)VS中右键项目=》属性=》安全性,勾选【启用ClickOne安全设置】;

    (2)找到app.manifest,将

    修改为 (3)再次找到项目属性的安全性,去掉【启用ClickOne安全设置】的勾选; ![](https://img2018.cnblogs.com/blog/196558/201907/196558-20190705150713123-2038560278.png)
  • 相关阅读:
    智能汽车无人驾驶资料调研(一)
    Python 学习
    关于中英文排版的学习
    UI Testing
    项目管理:第一次参与项目管理
    自动化测试用什么语言好
    什么是自动化测试
    睡眠的重要性
    python的pip和cmd常用命令
    矩阵的切片计算(截取)
  • 原文地址:https://www.cnblogs.com/tangge/p/11118631.html
Copyright © 2020-2023  润新知