簡體   English   中英

DataRow“指定的轉換無效”C#

[英]DataRow "Specified Cast is invalid" C#

無法弄清楚為什么這不起作用。 我收到相同的“指定演員表無效”錯誤消息。 C# 的新手,請善待。 它在if(!((int)WrkRow["ManualWeight"] == 1 | etc. 行失敗。我嘗試了一些代碼變體,並非全部粘貼在這里。ManualWeight 是表中的一個數字字段。

              if (dt.Rows.Count > 0)
            {
                DataRow WrkRow = dt.Rows[0];    // ds.Tables(0).Rows(0)
                if (mod1.IsTareout == true)
                    trim = (string)WrkRow["Trucker"];
                sBarcode = $"{trim.Trim()}{(string)WrkRow["TruckNo"]} ";

                XRSwatLaserCert rSwatLaserCert = new XRSwatLaserCert();
                rSwatLaserCert.DataSource = dt;

                DevExpress.XtraReports.UI.ReportPrintTool rpt = new DevExpress.XtraReports.UI.ReportPrintTool(rSwatLaserCert);
                {
                    XRBarCode XrBCTareOut = new XRBarCode();
                    rSwatLaserCert.XrBCTareOut = new XRBarCode
                    {
                        Text = sBarcode
                    };
                    if (!((int)WrkRow["ManualWeight"] == 1 | (int)WrkRow["ManualWeight"] == 3))
                    {
                        rSwatLaserCert.XrLabelManualGross1.Visible = false;
                        rSwatLaserCert.XrLabelManualGross2.Visible = false;
                        rSwatLaserCert.XrLabelManualGross3.Visible = false;
                    }

第二次嘗試:

            if (dt.Rows.Count > 0)
            {
                DataRow WrkRow = dt.Rows[0];    // ds.Tables(0).Rows(0)
                if (mod1.IsTareout == true)
                    trim = (string)WrkRow["Trucker"];
                sBarcode = $"{trim.Trim()}{(string)WrkRow["TruckNo"]} ";

                XRSwatLaserCert rSwatLaserCert = new XRSwatLaserCert();
                rSwatLaserCert.DataSource = dt;

                DevExpress.XtraReports.UI.ReportPrintTool rpt = new DevExpress.XtraReports.UI.ReportPrintTool(rSwatLaserCert);
                {
                    XRBarCode XrBCTareOut = new XRBarCode();
                    rSwatLaserCert.XrBCTareOut = new XRBarCode
                    {
                        Text = sBarcode
                    };
                    if (WrkRow.Field<int>("ManualWeight") != 1 | (int)WrkRow.Field<int>("ManualWeight") != 3)
                    {
                        rSwatLaserCert.XrLabelManualGross1.Visible = false;
                        rSwatLaserCert.XrLabelManualGross2.Visible = false;
                        rSwatLaserCert.XrLabelManualGross3.Visible = false;
                    }

第三次嘗試:

                if (dt.Rows.Count > 0)
            {
                DataRow WrkRow = dt.Rows[0];    // ds.Tables(0).Rows(0)
                if (mod1.IsTareout == true)
                    trim = (string)WrkRow["Trucker"];
                sBarcode = $"{trim.Trim()}{(string)WrkRow["TruckNo"]} ";

                XRSwatLaserCert rSwatLaserCert = new XRSwatLaserCert();
                rSwatLaserCert.DataSource = dt;

               ReportPrintTool rpt = new ReportPrintTool(rSwatLaserCert);
                {
                    XRBarCode XrBCTareOut = new XRBarCode();
                    rSwatLaserCert.XrBCTareOut = new XRBarCode
                    {
                        Text = sBarcode
                    };
                    var manweight = WrkRow.Field<int>("ManualWeight");
                    if (manweight != 1 | manweight == 3)
                    {
                        rSwatLaserCert.XrLabelManualGross1.Visible = false;
                        rSwatLaserCert.XrLabelManualGross2.Visible = false;
                        rSwatLaserCert.XrLabelManualGross3.Visible = false;
                    }

您可以使用Parse將值解析為 int 。 這就是 go 關於正常轉換字符串值的方式,但如果您有空格或非數字字符,則需要包括檢查以確保值是可解析的。 您也可以使用 try/catch ... 或int.TryParse("string", out int val)方法,如果解析成功則返回true ,否則返回false

if (!(int.Parse(WrkRow["ManualWeight"]) == 1 || int.Parse(WrkRow["ManualWeight"]) == 3))
{
    rSwatLaserCert.XrLabelManualGross1.Visible = false;
    rSwatLaserCert.XrLabelManualGross2.Visible = false;
    rSwatLaserCert.XrLabelManualGross3.Visible = false;
}

看看這張圖片,里面有很多東西,但希望它有助於理解這些東西:

在此處輸入圖像描述

快速數據表,帶有字符串、整數和小數; 約翰 20 歲,體重 10.123 隨便什么

當數據表在其行中存儲數據時,每一行實際上是一個object數組,這意味着任何時候你得到一個特定列的值,它看起來就像是一個object

看看我在哪里拉了var johnWeight - 我用var讓 C# 決定類型,所以我沒有誤導證人。 看看 Locals window(左下角) - 類型是object{decimal} - 這意味着它是decimal ,但裝在object

為了得到decimal 10.123,我們必須使用(decimal)進行轉換。 這是您現階段唯一可以做的事情; 您不能使用任何其他類型剝離object包裝,甚至不能將小數轉換為一個。 查看decimal johnWeightDecimal = (decimal)johnRow["Weight"]行; 這是剝離object包裝並得到decimal值。 您可以在本地 window 中看到它是類型列中的decimal

如果你想要它作為一個int即使它真的是一個decimal並包裹在object中,你首先必須使用強制轉換為真實類型(decimal)將 object 包裹關閉,然后使用(int)再次將其強制轉換為 int。 這是decimal johnWeightInt = (int)(decimal)johnRow["Weight"]行..


因此,如果您不知道您的項目是什么類型,您可以將其轉儲到 Immediate Window(參見屏幕截圖的右下角),或者您可以導航 Locals window 並展開樹,找到 Columns 集合,展開它,找到條目,檢查它們的 DataType..

在此處輸入圖像描述

所有這些加起來就是為什么普通的 DataTables 是一個巨大的痛苦。有一個解決方案:

  • 將 DataSet 類型的文件添加到您的項目中項目清單
  • 打開它,右鍵單擊,向它添加一個數據表,將列添加到數據表,設置它們的數據類型在此處輸入圖像描述
  • 現在您可以像使用任何其他合理的 class 一樣使用它,它具有命名屬性: 在此處輸入圖像描述

..沒有這種鑄造鑄造的乏味。 dt[0].Weight ,而不是(decimal)dt.Rows[0]["Weight"]

至關重要的是,PersonDataTable仍然是 DataTable (它繼承自它),因此您可以例如將其傳遞給正在執行SELECT Name, Age, Weight FROM users的某些數據適配器

var dt = new PersonDataTable();
someDataAdapter.Fill(dt);

實際上,DataSet 中有一個完整的生態系統來生成特定類型的 DataAdapter,但這有點超出 scope 的帖子

  1. 您能否檢查該列值是否為 null?

  2. 為了安全起見,您可以將其轉換為字符串並使用 Convert.ToInt32 方法嗎?

  3. 你能做一個權重變量,這樣你就可以調試和 hover 看看它是什么?

     if(.WrkRow.IsNull("ManualWeight")) { var weight = Convert.ToInt32(WrkRow["ManualWeight"];ToString()). if(weight == 1 || weight == 3) {.... } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM