C# 读取SQL数据创建动态Label展示Ping监控结果问题
代码修改方案
一、原有问题说明
- 第一版代码中
reader["host" + "ip" + " "]写法错误:方括号内是要读取的字段名,拼接后变成不存在的hostip字段,自然读不到数据 - 第二版代码错误点:
- 重复将Label同时添加到主窗口和flowLayoutPanel,会引发控件所属容器冲突
- 把批量Ping的调用写在循环内部,丧失了批量执行的能力,且参数赋值逻辑错误
ipAddress.Add("ip")是写死的字符串,没有读取数据库里的实际IP值
二、完整修改代码
private async void frmMainWindow_Load(object sender, EventArgs e) { // 数据库操作部分优化,用using自动释放资源 string conString = @"Data Source=PC\SQL;Initial Catalog=PingMonitorDB;Integrated Security=True"; DataTable dtTable = new DataTable(); using (SqlConnection cnn = new SqlConnection(conString)) using (SqlCommand cmd = new SqlCommand("SELECT host, ip FROM addhosts", cnn)) using (SqlDataAdapter dp = new SqlDataAdapter(cmd)) { cnn.Open(); dp.Fill(dtTable); } // 准备批量Ping需要的地址列表和对应控件列表 List<string> addressList = new List<string>(); List<Control> labelControlList = new List<Control>(); for (int i = 0; i < dtTable.Rows.Count; i++) { string host = dtTable.Rows[i]["host"].ToString(); string ip = dtTable.Rows[i]["ip"].ToString(); Label lbl = new Label(); lbl.AutoSize = true; lbl.Font = new Font("Arial", 12, FontStyle.Bold); // 初始展示主机名和IP,Ping完成后会自动追加结果 lbl.Text = $"{host} {ip} 检测中..."; lbl.BackColor = System.Drawing.Color.Orange; // 只添加到flowLayoutPanel即可,自动排列不会重叠 flowLayoutPanel1.Controls.Add(lbl); // 把对应IP和控件加入批量调用的列表 addressList.Add(ip); labelControlList.Add(lbl); } // 遍历完所有记录后统一调用批量Ping if (addressList.Any()) { var massPing = new MassPing(); // 对应索引的IP和Label会自动匹配,只需要修改MassPing的更新逻辑,将Ping结果拼到Label.Text末尾即可得到要求的展示格式 await massPing.PingAll(addressList.ToArray(), labelControlList.ToArray(), 2000); } }
内容的提问来源于stack exchange,提问作者user14568805
相关产品推荐
相关产品推荐

