在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
引用: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; }
|
请发表评论