You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类型转换错误: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}");
    }
}

额外优化点

  1. 使用唯一标识匹配服务:用ServiceName(对应myService的Product字段)查找服务,避免DisplayName重复导致的匹配错误。
  2. 状态校验:启动前判断服务是否处于停止状态,防止重复启动抛出异常。
  3. 实时更新界面:启动后更新myService的状态字段,让界面同步显示服务最新状态。
  4. 资源释放:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:31:01