我有一个我创建的自定义控件,当一切都是单线程时它正在工作。在我将其发送到界面之前,它会使用第一条消息进行更新。
我有一个数据表:
DataTable dtNew = new DataTable(szTableName); // to add into a dataset later
dtNew.Columns.Add("EventDate",typeof(string));
dtNew.Columns.Add("Function",typeof(string));
dtNew.Columns.Add("IsError",typeof(bool));
dtNew.Columns.Add("LongMessage",typeof(string));
dtNew.Columns.Add("Message",typeof(string));
dtNew.Columns.Add("Process",typeof(string));
dtNew.Columns.Add("RecID",typeof(string));
dtNew.Columns.Add("Thread",typeof(string));
dtNew.Columns.Add("UserName", typeof(string));
ProcessStatus NewPanel = new ProcessStatus(); // create custom control
NewPanel.SetDataSource(ref dtNew); // sets the datasource to the datatable
dsLogs.Tables.Add(dtNew); // add datatable into dataset
自定义控件接收数据源,因此应绑定:
public partial class ProcessStatus : UserControl
{
public ProcessStatus()
{
InitializeComponent();
}
public void SetProcess(string szProcName)
{
lblProcess.Text = "Process: " + szProcName;
}
public void SetThread(string szThreadName)
{
lblThreadNum.Text = "Thread: " + szThreadName;
}
public void SetDataSource(ref DataTable dtTable)
{
dgvProcess.DataSource = dtTable;
dgvProcess.Columns["EventDate"].Visible = false;
//dgvProcess.Columns["Function"].Visible = false;
dgvProcess.Columns["IsError"].Visible = false;
dgvProcess.Columns["LongMessage"].Visible = false;
//dgvProcess.Columns["Message"].Visible = false;
dgvProcess.Columns["Process"].Visible = false;
dgvProcess.Columns["RecID"].Visible = false;
dgvProcess.Columns["Thread"].Visible = false;
dgvProcess.Columns["UserName"].Visible = false;
dgvProcess.Columns["Function"].Width = 80;
dgvProcess.Columns["Message"].Width = 200;
}
// only show first line
private void dgvProcess_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
if (dgvProcess.RowCount > 0)
dgvProcess.FirstDisplayedScrollingRowIndex = dgvProcess.RowCount - 1;
}
}
使用新消息更新数据表时,该消息不会在自定义控件中更新(在数据网格中)。再次,这确实在单线程上工作,所以我可能没有做正确的事情来允许它更新crossthreads或类似的东西......