类型转换错误:WpfApp1.myService无法转为System.Data.DataRowView求助
解决WPF单个服务启动按钮的类型转换错误
问题现象
开发的WPF程序可搜索并展示名称包含“VMware”的Windows服务,批量启动功能正常,但点击单个服务的启动按钮时,抛出类型转换错误:
WpfApp1.myService类型的对象无法转换为System.Data.DataRowView类型
问题原因
DataGrid的ItemsSource绑定的是ObservableCollection<myService>集合,因此每行按钮的DataContext对应的是myService实例,而非DataRowView。原代码错误地将DataContext强制转换为DataRowView,导致类型不匹配。
修复方案
修改单个启动按钮的点击事件处理方法,直接获取myService对象,通过其中存储的服务名称查找对应的ServiceController并启动:
修改后的btnStrt_Click方法代码
private void btnStrt_Click(object sender, RoutedEventArgs e) { try { // 获取当前按钮绑定的myService对象 myService selectedService = (myService)((Button)sender).DataContext; // 通过ServiceName查找对应的服务(ServiceName是系统唯一标识,比DisplayName更可靠) using (ServiceController scTemp = new ServiceController(selectedService.Product)) { if (scTemp.Status == ServiceControllerStatus.Stopped) { scTemp.Start(); // 可选:等待服务启动完成,超时10秒 scTemp.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10)); // 更新列表中的服务状态显示 selectedService.Price = scTemp.Status.ToString(); } } MessageBox.Show("服务已启动"); } catch (Exception ex) { MessageBox.Show($"启动失败:{ex.Message}"); } }
额外优化点
- 使用唯一标识匹配服务:用
ServiceName(对应myService的Product字段)查找服务,避免DisplayName重复导致的匹配错误。 - 状态校验:启动前判断服务是否处于停止状态,防止重复启动抛出异常。
- 实时更新界面:启动后更新
myService的状态字段,让界面同步显示服务最新状态。 - 资源释放:用
using语句包裹ServiceController,确保系统资源被正确释放。
完整关键代码片段
namespace WpfApp1 { public partial class MainWindow : Window { // 保留原构造方法和批量启动方法不变 private void btnStrt_Click(object sender, RoutedEventArgs e) { try { myService selectedService = (myService)((Button)sender).DataContext; using (ServiceController scTemp = new ServiceController(selectedService.Product)) { if (scTemp.Status == ServiceControllerStatus.Stopped) { scTemp.Start(); scTemp.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10)); selectedService.Price = scTemp.Status.ToString(); } } MessageBox.Show("服务已启动"); } catch (Exception ex) { MessageBox.Show($"启动失败:{ex.Message}"); } } } public class myService { public string ProductId { get; set; } public string Product { get; set; } // 存储ServiceName public string Category { get; set; } // 存储DisplayName public string Price { get; set; } // 存储服务状态 } }
内容的提问来源于stack exchange,提问作者Wishy
相关产品推荐
相关产品推荐

