【问题标题】:Unable to cast object of type 'System.Windows.Controls.DataGridTextColumn' to type 'System.IConvertible' error无法将“System.Windows.Controls.DataGridTextColumn”类型的对象转换为“System.IConvertible”错误
【发布时间】:2019-09-04 13:34:26
【问题描述】:

我正在使用DataGrid构建WPF表单,当检查复选框时,将数据从DataGrid中拉到“选择”该行。

DOC_Number 是一个 int,但它是从 SQL 服务器中提取数据网格中的数据。我试图将它转换为字符串或文本,因为它告诉我它之前作为整数是不可接受的,现在它不会转换为字符串。

我不确定它是否没有正确获取复选框数据,或者 DOC_Number 是否没有注册为 int。

我收到一个错误:

System.InvalidCastException: '无法将'System.Windows.Controls.DataGridTextColumn' 类型的对象转换为'System.IConvertible' 类型

在线int DocIdx = Convert.ToInt32(DOC_Number);

private void BtnGridUpdate_Click(object sender, EventArgs e)
{
    int employeeID = Convert.ToInt32(EmpID.Text);
    UpdateInternal0(employeeID);
} 

void UpdateInternal0(int employeeId)
{
    try
    {
        using (SqlConnection con = new SqlConnection(Properties.Settings.Default.adminConnectionString))
        {
            con.Open();

            foreach (DataRowView drv in InternalGrid0.SelectedItems)
            {
                DataRow row = drv.Row;
                bool isSelected = Convert.ToBoolean(drv.Row[0]);
                if (isSelected)
                {
                    string sqlString = "INSERT INTO ChecklistTransitionTable (RelatedEmployeeID, RelatedDocIdx) VALUES (@EmpID, @DOC_Number)";

                    using (SqlCommand cmd = new SqlCommand(sqlString, con))
                    {
                        for (int i = 0; i < InternalGrid0.Columns.Count; i++) 
                        {

                            int DocIdx = Convert.ToInt32(DOC_Number);
                            int employeeID = Convert.ToInt32(EmpID.Text);

                            cmd.Parameters.AddWithValue("@EmpID", employeeID = (int)row[i]);
                            cmd.Parameters.AddWithValue("@DOC_Number", DocIdx = (int)row[i]);

                            int result = cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();

                            Console.WriteLine("Test");
                            //Check Error
                            if (result < 0)
                            {
                                System.Windows.Forms.MessageBox.Show("Error inserting data into database!");
                            }
                        }
                    }
                }
            }
        }

        System.Windows.Forms.MessageBox.Show("Employee data successfully updated.");
    }

    catch (SqlException ex)
    {
        System.Windows.Forms.MessageBox.Show(string.Format("\nMessage ---\n{0}", ex.Message));
    }
}

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    for 循环遍历列没有意义。你应该能够从DataRow row对象获取文档ID:

    foreach (DataRowView drv in InternalGrid0.SelectedItems)
    {
        DataRow row = drv.Row;
        bool isSelected = Convert.ToBoolean(drv.Row[0]);
        if (isSelected)
        {
            string sqlString = "INSERT INTO ChecklistTransitionTable (RelatedEmployeeID, RelatedDocIdx) VALUES (@EmpID, @DOC_Number)";
    
            using (SqlCommand cmd = new SqlCommand(sqlString, con))
            {
                int DocIdx = Convert.ToInt32(row["DOC_Number"]);
    
                cmd.Parameters.AddWithValue("@EmpID", employeeId);
                cmd.Parameters.AddWithValue("@DOC_Number", DocIdx);
    
                int result = cmd.ExecuteNonQuery();
                if (result < 0)
                {
                    System.Windows.Forms.MessageBox.Show("Error inserting data into database!");
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      相关资源
      最近更新 更多