也许这是一个新手问题。但我一直在寻找高低,没有运气,因为我尝试过的任何事情都没有。
我有一个DataGridView
名为dgvDeviceList
,其中包含5列:FormMain窗口中的ID,设备名称,Mac地址,RSSI和广告类型。
当我使用方法扫描附近的蓝牙设备时,一旦找到一个,DataGridView将添加一个新创建的行。
但是当扫描正在进行或停止时,我无法选择行或控制(向上/向下滚动)滚动条。它看起来dgvDeviceList
没有滚动条。在某些论坛上,它被描述为multiple threading problem
,但不幸的是,他们提供的方法无法解决问题。这是代码:
int rowIndex = 1;
private void SetupScanResultHandler()
{
ScanCallBack.ScanResultHandler = (result) =>
{
if (result != null)
{
foreach (var item in result.ScanRecords)
{
//the following InvokeRequired method is provided by internet
if (dgvDeviceList.InvokeRequired)
{
dgvDeviceList.Invoke((MethodInvoker)(() =>
{
SetupDeviceListDataGridView(item);
}));
}
else
{
SetupDeviceListDataGridView(item);
}
rowIndex++;
}
}
};
}
private void SetupDeviceListDataGridView(CyScanRecord item)
{
DataGridViewRow row = dgvDeviceList.Rows[dgvDeviceList.Rows.Add()];
row.Cells[0].Value = rowIndex;
row.Cells[1].Value = Utility.GetDeviceName(item.AdvertisementData.RawData.Length, item.AdvertisementData.RawData);
row.Cells[2].Value = Utility.InsertFormat(item.PeerDeviceAddress.Address.ToString("X12"), 2, ":");
row.Cells[3].Value = item.RSSI.ToString() + "dBm";
row.Cells[4].Value = item.AdvertisementType.ToString();
}
如果您能发布一些代码或指示我,我将非常感激 我应该研究的正确方法。感谢。
答案 0 :(得分:0)
将值添加到DataTable而不是DGV。确保添加新行:DataRow newRow = new dt1.Rows.Add();
private void SetupDeviceListDataGridView(DataRow row)
{
row[0] = 5;
row[1] = 25;
row[2] = 25;
row[3] = 10;
row[4] = 35;
dgvDeviceList.DataSource = null;
dgvDeviceList.DataSource = dataTabl;
}
答案 1 :(得分:0)
糟糕!我在属性列表中将Enable
属性设置为false
。代码dgvDeviceList.enable = true;
可以解决问题。应该没有错误。