引用:http://cgxcn.blog.163.com/blog/static/132312422009542570727/
方法一:
我在做一个聊天程序的时候遇到这样一个问题,我需要将操作类与窗体分离,就是说类来实现所有的操作,窗体类中只进行调用类,如果是简单的操作,很容易实现,但是如果里面设计到有参数或有返回的线程,就可能有些困难,所以在这里说一下,用类来控制窗体部分控件的方法.就写一个很简单的例子:
比如说现在我们有一个form1窗体,上面有一个label1控件,现在我们要实现执行Class1类来改变label1.text为"hello",可以这样来作:
1.在form1中添加属性
public string SetLabelText
{
set
{
this.Label1.text = value;
}
}
2.然后可以在Class1的类中写一个方法
public static voic SetText( Form1 objForm ) //这里传递的是Form1窗体类的一个实例
{
objForm.SetLabelText = "hello"; //这样就可以找到我们定义的属性
}
3.在Form1里的相应事件中写入
Class1.SetText( this );
这样就可以将窗体作为参数传入类,然后可以根据属性来对其进行相应的操作,如果动动脑筋,可以实现更多.
方法二:
带线程的操作
主窗体:FrmBackup.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace DataBackup
{
public partial class FrmBackup : Form
{
public FrmBackup()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
#region 重写窗体属性<不同类调用的地方>
public bool SetForm
{
set
{
this.Enabled = value;
}
}
public bool SetProgressBar
{
set
{
this.progressBar.Visible = value;
}
}
#endregion
#region 恢 复
private void btnRegain_Click(object sender, EventArgs e)
{
this.Enabled = false;
OpenFileDialog op = new OpenFileDialog();
//标题
op.Title = "选择数据库备份文件";
//文件初始路径
op.InitialDirectory = dbpath;
//当前文件名筛选器
op.Filter = "数据库文件(*.mdb)|*.mdb";
//文件对话框中当前选定筛选器的索引
op.FilterIndex = 1;
if (op.ShowDialog() == DialogResult.OK)
{
//显示进度条
this.progressBar.Visible = true;
this.progressBar.BringToFront();
this.progressBar.Size = new Size(307, 35);
this.progressBar.Location = new Point(81, 157);
this.progressBar.Maximum = 100;
this.progressBar.Step = 1;
string source_path = "..\\DbMVC\\bin\\gs_gw680.mdb";
//进度条线程
Thread td1 = new Thread(new ThreadStart(PrgBar));
td1.IsBackground = true;
td1.Start();
//数据库文件名
string dbname = op.FileName;
//这里就是使用线程的地方,把当前窗体用this传过去
BackOther bac = new BackOther(dbname, source_path, this);
Thread rec = new Thread(new ThreadStart(bac.RecoverAcsInfo));
rec.IsBackground = true;
rec.Start();
}
}
#endregion
}
}
需要改变窗体控件属性的类,如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Data.OleDb;
namespace DataBackup
{
/// <summary>
/// Self_Class:关于备份操作的其它方法
/// </summary>
public class BackOther
{
public BackOther()
{
}
#region 构造函数相关<接收窗体及其要传的值>
string db_path = string.Empty;
string source_path = string.Empty;
FrmBackup frm_bk = null;
public BackOther(string path, string sourcepath, FrmBackup frmbk)
{
this.db_path = path;
this.source_path = sourcepath;
this.frm_bk = frmbk;
}
#endregion
#region 本类全局变量
/// <summary>
/// Self_Variable:连接对象
/// </summary>
private OleDbConnection objAcsSqlConnection = null;
/// <summary>
/// Self_Variable:恢复数据库对象
/// </summary>
private OleDbConnection objSqlConnection = null;
#endregion
#region 数 据 恢 复
/// <summary>
/// Self_Function:数据恢复
/// </summary>
/// <param name="path">备份数据库路径</param>
/// <param name="dbpath">恢复的目的数据库</param>
/// <returns>TRUE or FALSE </returns>
public void RecoverAcsInfo()
{
try
{
//其它代码......
}
catch (Exception)
{
throw;
}
finally
{
//改变FrmBackup窗体属性的入口
MessageBox.Show("恢复完成!");
SetText(frm_bk);
}
}
/// <summary>
/// Self_Form:跨类改变控件属性
/// </summary>
/// <param name="objForm">传递的是FrmBackup窗体类的一个实例</param>
public static void SetText(FrmBackup objForm)
{
//这样就可以找到我们定义的属性
objForm.SetForm = true;
objForm.SetProgressBar = false;
}