【问题标题】:Invalid Operation Exception in Windows Form ApplicationWindows 窗体应用程序中的无效操作异常
【发布时间】:2017-08-24 10:48:02
【问题描述】:

我正在 Windows 窗体应用程序中使用 WCF 服务。我的 WCF 服务有两个类,称为 FulltimeEmployeeParttimeEmployee。我想根据员工类型将 Wcf 服务与 Windows Fomr 应用程序一起使用,将用户注册到 Sql 数据库中。用户类型将来自 emu 类型,但我无法编译它并显示以下错误...

这两行的操作异常无效,它还说通过 ListControl 获取或设置属性成员的值..

 private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {

            if (comboBox2.SelectedValue =="-1")//Error in this line
            {
                txtHourlyPay.Visible = false;
                txtHoursWorked.Visible = false;
                label6.Visible = false;
                label7.Visible = false;

            }
            else if (comboBox2.SelectedValue =="1")//Error on this line 
            {

                txtHourlyPay.Visible = true;
                txtHoursWorked.Visible = true;
                label6.Visible = true;
                label7.Visible = true;

            }
        }

这是全职和兼职员工类的代码..

[DataContract]
public class FullTimeEmployee : Employee
{
    public int AnnualSalary { get; set; }
}

[DataContract]
public class PartTimeEmployee : Employee
{
    public int HourlyPay { get; set; }
    public int HoursWorked { get; set; }
}

这里是代码表单类..

 [KnownType(typeof(FullTimeEmployee))]
    [KnownType(typeof(PartTimeEmployee))]
    [DataContract(Namespace = "http://pragimtech.com/Employee")]
    public class Employee
    {
        private int _id;
        private string _name;
        private string _gender;
        private DateTime _dateOfBirth;

        [DataMember(Order = 1)]
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        [DataMember(Order = 2)]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        [DataMember(Order = 3)]
        public string Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        [DataMember(Order = 4)]
        public DateTime DateOfBirth
        {
            get { return _dateOfBirth; }
            set { _dateOfBirth = value; }
        }

        [DataMember(Order = 5)]
        public EmployeeType Type { get; set; }
    }

    public enum EmployeeType
    {
        FullTimeEmployee = 1,
        PartTimeEmployee = 2
    }
}

这是根据类型注册员工的 WCF 服务代码:

public void SaveEmployee(Employee employee)
{
    string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

    using (SqlConnection con = new SqlConnection(cs))
    {
        SqlCommand cmd = new SqlCommand("spSaveEmployee", con);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter parameterId = new SqlParameter
                {
                    ParameterName = "@Id",
                    Value = employee.Id
                };
        cmd.Parameters.Add(parameterId);

        SqlParameter parameterName = new SqlParameter
                {
                    ParameterName = "@Name",
                    Value = employee.Name
                };
        cmd.Parameters.Add(parameterName);

        SqlParameter parameterGender = new SqlParameter
                {
                    ParameterName = "@Gender",
                    Value = employee.Gender
                };
        cmd.Parameters.Add(parameterGender);

        SqlParameter parameterDateOfBirth = new SqlParameter
                {
                    ParameterName = "@DateOfBirth",
                    Value = employee.DateOfBirth
                };
        cmd.Parameters.Add(parameterDateOfBirth);

        SqlParameter parameterEmployeeType = new SqlParameter
                {
                    ParameterName = "@EmployeeType",
                    Value = employee.Type
                };
        cmd.Parameters.Add(parameterEmployeeType);

        if (employee.GetType() == typeof(FullTimeEmployee))
        {
            SqlParameter parameterAnnualSalary = new SqlParameter
                    {
                        ParameterName = "@AnnualSalary",
                        Value = ((FullTimeEmployee)employee).AnnualSalary
                    };
            cmd.Parameters.Add(parameterAnnualSalary);
        }
        else
        {
            SqlParameter parameterHourlyPay = new SqlParameter
                    {
                        ParameterName = "@HourlyPay",
                        Value = ((PartTimeEmployee)employee).HourlyPay,
                    };
            cmd.Parameters.Add(parameterHourlyPay);

            SqlParameter parameterHoursWorked = new SqlParameter
                    {
                        ParameterName = "@HoursWorked",
                        Value = ((PartTimeEmployee)employee).HoursWorked
                    };
            cmd.Parameters.Add(parameterHoursWorked);
        }

        con.Open();
        cmd.ExecuteNonQuery();
    }
}

这是 Windows 窗体应用程序代码:

private void button1_Click(object sender, EventArgs e)
{
    MyService.HalifaxServiceClient myservice = new MyService.HalifaxServiceClient("NetTcpBinding_IHalifaxService");

    MyService.Employee employee = null;

    if (((MyService.EmployeeType)Convert.ToInt32(comboBox2.SelectedValue)) == MyService.EmployeeType.FullTimeEmployee)
    {
        employee = new MyService.FullTimeEmployee
                   {
                      Id = Convert.ToInt32(textBox1.Text),
                      Name = txtName.Text,
                      Gender = comboBox1.Text,
                      DateOfBirth = Convert.ToDateTime(txtDateOfBirth.Text),
                      Type = MyService.EmployeeType.FullTimeEmployee(comboBox2.SelectedValue),//Error
                      AnnualSalary = Convert.ToInt32(txtAnnualSalary.Text),
                   };
        myservice.SaveEmployee(employee);
        label8.Text = "Employee saved";
    }
    else if (((MyService.EmployeeType)Convert.ToInt32(comboBox2.SelectedValue)) == MyService.EmployeeType.PartTimeEmployee)
    {
        employee = new MyService.PartTimeEmployee
                       {
                           Id = Convert.ToInt32(textBox1.Text),
                           Name = txtName.Text,
                           Gender = comboBox1.Text,
                           DateOfBirth = Convert.ToDateTime(txtDateOfBirth.Text),
                           Type = MyService.EmployeeType.PartTimeEmployee(comboBox2.SelectedValue),//Error
                           HourlyPay = Convert.ToInt32(txtHourlyPay.Text),
                           HoursWorked = Convert.ToInt32(txtHoursWorked.Text),
                       };
        myservice.SaveEmployee(employee);
        label8.Text = "Employee saved";
    }
    else
    {
       label8.Text = "Please select Employee Type";
    }
}

private void button2_Click(object sender, EventArgs e)
{
    this.Close();
}



private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {

        if (comboBox2.SelectedValue =="-1")
        {
            txtHourlyPay.Visible = false;
            txtHoursWorked.Visible = false;
            label6.Visible = false;
            label7.Visible = false;

        }
        else if (comboBox2.SelectedValue =="1")
        {

            txtHourlyPay.Visible = true;
            txtHoursWorked.Visible = true;
            label6.Visible = true;
            label7.Visible = true;

        }
    }

当我点击提交按钮时,它会显示错误消息

并且不会将新员工插入 SQL Server 数据库。..

这是输出截图:

请帮我纠正这个错误...

【问题讨论】:

  • 通常,如果您希望得到快速响应,您可以添加赏金,而不是对问题发表评论。但我怀疑你的声望太低了
  • 不..我不想在线。无论如何,我正在检查你的答案

标签: c# windows web-services wcf


【解决方案1】:

我认为您想要 SelectedItem,而不是 SelectedValue 在您的组合框中。以这段代码为例,我认为它模仿了你的代码:

    public partial class Form1 : Form
{
    public Form1()
    {

        InitializeComponent();
        comboBox2.Items.Add(Employee.FullTimeEmployee);
        comboBox2.Items.Add(Employee.PartTimeEmployee);
        comboBox2.SelectedIndexChanged += ComboBox1OnSelectedIndexChanged;
        label1.Text = "Full text: ";
        label2.Text = "Integer value: ";
    }

    private void ComboBox1OnSelectedIndexChanged(object sender, EventArgs eventArgs)
    {
        label1.Text = "Full text: " + ((ComboBox) sender).SelectedItem;
        label2.Text = "Integer value: " + (int)(Employee)(((ComboBox)sender).SelectedItem);
    }
}

public enum Employee
{
    FullTimeEmployee = 1,
    PartTimeEmployee = 2
}

从那里你应该得到这些结果:

您可以在代码中看到比较文本,您可以只抓取所选项目,但要获得整数值,您需要将其转换为 int。希望这会有所帮助,祝您编码愉快!

【讨论】:

  • 当我运行它时仍然显示请选择员工类型??????????当我点击提交按钮时
  • 我不知道该说什么。当我单击提交按钮时,您能否检查一下它仍然显示请在消息标签中选择员工类型
  • 我想根据员工类型在数据库中插入一条记录
  • 用“SelectedItem”替换所有“SelectedValue”实例。您的 if 语句可以简单地是:if((MyService.EmployeeType)(((ComboBox)sender).SelectedItem) == MyService.EmployeeType.FullTimeEmployee) { ...} else if ((MyService.EmployeeType)(((ComboBox)sender).SelectedItem) == MyService.EmployeeType.PartTimeEmployee) {...}
  • 它正在按照您的建议工作。感谢您宝贵的时间朋友
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 2013-08-16
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
相关资源
最近更新 更多