交叉线程操作无效 - 更改网格单元格值

时间:2011-11-05 04:34:54

标签: c# winforms multithreading

你好开发者,再次出现新问题!!
在我的线程程序中,当我更改控件值时,我遇到了问题。

问题是:跨线程操作无效。
是的..我得到了具有以下功能的解决方案,让我允许在线程中访问控制。

delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
private void SetControlPropertyValue(Control oControl, string propName, object propValue)
{
    if (oControl.InvokeRequired)
    {
        SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
        oControl.Invoke(d, new object[] { oControl, propName, propValue });                
    }
    else
    {
        Type t = oControl.GetType();
        System.Reflection.PropertyInfo[] props = t.GetProperties();
        foreach (System.Reflection.PropertyInfo p in props)
        {
            if (p.Name.ToUpper() == propName.ToUpper())
            {
                p.SetValue(oControl, propValue, null);
            }
        }
    }
}

当我需要更改控件的值(喜欢更改标签的文字)时,我使用该功能
SetControlPropertyValue(_form.lblImportFiles,“Text”,“Importing ...”); 就像这样改变它的值。
现在..我想更改网格单元格的值或需要使用其Rows属性..等等..

我怎样才能做到这一点?我完全失明了。把我从这个问题中解脱出来。

1 个答案:

答案 0 :(得分:1)

如果你想在Datagridview中设置值,那么试试这个,

private void ChangeGridUploadStatus(DataGridView dgv)
{
if (!dgv.InvokeRequired)
{
dgv["ColumnName", index].Value = "ok";
}
else
{
dgv.Invoke(new ChangeGridUploadStatusHandler(ChangeGridUploadStatus), dgv);
}
}
delegate void ChangeGridUploadStatusHandler(DataGridView dgv);