【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安全设置】的勾选;

【winform】主窗体多线程给子窗体传值的更多相关文章
- winform里操作打开在panel里的form窗体,子窗体操作同级子窗体或者父窗体的方法
最近开始了一个winform项目,原先一直都是web项目.遇到个问题,就是在框架内,左侧和中间的main都是用panel来实现的form,就是把form窗体打开到panel里,实现左侧是导航,中间是操 ...
- 主窗体里面打开子窗体&&打印饼图《Delphi 6数据库开发典型实例》--图表的绘制
\Delphi 6数据库开发典型实例\图表的绘制 1.在主窗体里面打开子窗体:ShowForm(Tfrm_Print); procedure Tfrm_Main.ShowForm(AFormClass ...
- C#嵌入子窗体,判断子窗体是否打开了
/// <summary> /// 嵌入子窗体,判断子窗体是否打开了 /// </summary> public static Form1 f; public void For ...
- Winform中如何实现父窗体传递数据到子窗体并刷新子窗体
原理:利用委托和事件,本文将以图文并茂的例子讲述,告诉我们So Easy --------------------------------------------------------------- ...
- WinForm中如何实现在容器控件中嵌入form窗体(panel与子窗体)
今天在做项目时候遇到一个问题,窗体分为左右两部分,要求在左边栏点击按钮时,右边动态加载窗体最后想到用panel实现,经历几次失败,并查找资料后,终于搞定 说明:如果多次切换需加入 panel.clea ...
- Ribbon 窗体的 MDI 子窗体使用 TabbedMDIManager 切换时工具条闪屏问题的解决办法
补充说明: 此问题已经在新版本中解决(15.2.6),方法更加简单,只需要在 MDIChild 窗体的 Create 方法中,将 Ribbon 的 Visible 属性设置为 false 就可以了,且 ...
- js父窗体关闭,子窗体紧随
近来的.我们遇到了权限管理系统.由于权限管理系统与原系统的风格不符.打开一个全新的窗口.问题就来了.admin取消后,,权限管理形式不关闭.其他普通用户登录后.尚能经营权的管理形式. 简化问题:adm ...
- 父窗体的委托,子窗体注册,this.Owner是关键
//声明委托 public delegate void RefreshParentHandler<T>(T obj); //父窗体的委托 public RefreshParentHandl ...
- 【VC】Dialog 窗体随意切割子窗体。
用 Dialog 对话框来实现窗体的随意切割. 在资源中加入 Dialog 选择 IDD_FORMVIEW 资源..分别新建FormViewOne,FormViewTwo FormViewThre ...
随机推荐
- webdriver切换frame的方法
iframe: iframe 就是一个特殊的html 元素, 它在原来的html 范围内,开辟了一个新的HTML. iframe 元素会创建包含另外一个文档的内联框架(即行内框架) 理解:网页嵌套网页 ...
- MYSQL慢查询优化方法及优化原则
1.日期大小的比较,传到xml中的日期格式要符合'yyyy-MM-dd',这样才能走索引,如:'yyyy'改为'yyyy-MM-dd','yyyy-MM'改为'yyyy-MM-dd'[这样MYSQL会 ...
- Ubuntu安装Java环境经历
1.权限不够 sudo su gedit /etc/sudoers 添加 用户名 ALL=(ALL:ALL) ALL 2.配置java 放到 /usr/lib/jvm/下 sudo gedit /et ...
- node.js 学习一
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. 与PHP 相似 都是单进程. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调 ...
- 【Code Tools】AB性能测试工具(二)
一.测试Get请求 1.每次并发请求10个,总共1000个请求 ab -n -c https://www.baidu.com/ 2.指定Header参数 通过-H来指定 ab -n -c -H 'Ac ...
- 第五次作业——Alpha项目测试
第五次作业——Alpha项目测试 格式描述: 这个作业属于哪个课程 2019秋软工17级系统分析与设计 这个作业要求在哪里 作业要求 团队名称 杨荣模杰和他的佶祥虎 这个作业的目标 测试其他组项目并写 ...
- jquery 表单元素选择器
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...
- O(n) 取得数组中每个元素右边第一个比它大的元素
题目: 给定一个整型数组,数组元素随机无序的,要求打印出所有元素右边第一个大于该元素的值. 如数组A=[6,8,9,2,3,5,6] 输出[8,9,-1,3,5,6,-1] 思路: 我们用栈来保存未找 ...
- G1垃圾收集器系统化说明【官方解读】
还是继续G1官网解读,上一次已经将这三节的东东读完了,如下: 所以接一来则继续往下读: Reviewing Generational GC and CMS[回顾一下CMS收集器] The Concur ...
- Uva1349Optimal Bus Route Design(二分图最佳完美匹配)(最小值)
题意: 给定n个点的有向图问,问能不能找到若干个环,让所有点都在环中,且让权值最小,KM算法求最佳完美匹配,只不过是最小值,所以把边权变成负值,输出时将ans取负即可 这道题是在VJ上交的 #incl ...