首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

多线程绑定DataGridView的有关问题

2012-01-19 
多线程绑定DataGridView的问题单击Button5绑定DataGridView,代码如下:delegatevoidMyDeletegate()stringc

多线程绑定DataGridView的问题
单击Button5绑定DataGridView,代码如下:
delegate   void   MyDeletegate();
string   connString   =   "server=.;uid=sa;pwd=speed;database=Northwind ";

private   void   button5_Click(object   sender,   EventArgs   e)
{
        Thread   t   =   new   Thread(new   ThreadStart(ThreadBind));
        t.Name   =   "NewThread ";
        t.Start();                        
}

private   void   ThreadBind()
{
          this.BeginInvoke(new   MyDeletegate(BindGrid));                        
}

private   void   BindGrid()
{
          SqlConnection   sqlconn   =   new   SqlConnection(connString);
          sqlconn.Open();

            SqlDataAdapter   adp   =   new   SqlDataAdapter( "SELECT   *   FROM   Products ",   sqlconn);
            SqlCommandBuilder   sqlcomm   =   new   SqlCommandBuilder(adp);

            DataSet   ds   =   new   DataSet();
            adp.Fill(ds);
            this.dataGridView1.DataSource   =   ds.Tables[0];
            sqlconn.Close();
}


现在的问题是绑定DataGridView的时候界面还是处于假死状态,应该怎么样做才能保证界面不是假死呢?

[解决办法]
up
[解决办法]
我觉得你可以使用BackgroundWorker后台线程来做,异步调用数据。
待RunWorkerCompleted再给控件加载数据。
你直接用线程访问控件这种方法是不安去的。这个msdn文档里面有做说明。
所以微软搞了个BackgroundWorker,我觉得这个可以。
你试试看。

[解决办法]

public partial class frmUserManger :  BaseForm
{
public frmUserManger()
{
InitializeComponent();
}
Tb_Employee ltb = null;

private BackgroundWorker bg = new BackgroundWorker();

DataTable dtcbo ;

private void frmUserManger_Load(object sender, EventArgs e)
{
ltb = new Tb_Employee();
BindGridView();

bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
bg.RunWorkerAsync();
}

void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
cboType.DataSource = dtcbo;
cboType.DisplayMember = "Value ";
cboType.ValueMember = "UID ";
}

void bg_DoWork(object sender, DoWorkEventArgs e)
{
DataTable dt = new clsStandardCode().GetStandardCodeList( "subkind ");
DataTable dt2 = new clsStandardCode().GetStandardCodeList( "department ");

DataTable dttemp = dt.Copy();
dttemp.Merge(dt2, true);
dtcbo = dttemp;
}

private void BindGridView()


{
DataSet lds = GetSeriviceData.User.UserManger.GetUserList();
gridControl1.DataSource = lds.Tables[0];
Convert_to_CHN();
}
private void Convert_to_CHN()
{

EditZHCN myeditLocalizer = new EditZHCN();
GridZHCN mygridLocalizer = new GridZHCN();
DevExpress.XtraEditors.Controls.Localizer.Active = myeditLocalizer;
DevExpress.XtraGrid.Localization.GridLocalizer.Active = mygridLocalizer;
}
protected override bool SaveMod()
{
ltb.Uid = int.Parse(lblID.Text.Trim());
ltb.ChnName = txtcnname.Text.Trim();
ltb.EngName = txtengname.Text.Trim();
ltb.StationUid = int.Parse(cboType.SelectedValue.ToString());
Employee ep =new Employee(ltb);
ep.Updte();
BindGridView();
return true;

}

protected override bool SaveNew()
{
ltb.ChnName = txtcnname.Text.Trim();
ltb.EngName = txtengname.Text.Trim();
ltb.StationUid = int.Parse(cboType.SelectedValue.ToString());

Employee ep = new Employee(ltb);
ep.Updte();
BindGridView();
return true;
}
protected override bool Del()
{
ltb.Uid = int.Parse(lblID.Text);
Employee ep = new Employee(ltb);
ep.Delete();
BindGridView();
return true;
}



private void gridView1_Click(object sender, EventArgs e)
{
DataRow dr = gridView1.GetDataRow(gridView1.FocusedRowHandle);
lblID.Text = dr[ "UID "].ToString();
txtcnname.Text = dr[ "chnname "].ToString();
txtengname.Text = dr[ "engname "].ToString();
cboType.SelectedText = dr[ "stationname "].ToString();
}

}

热点排行