[英]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 是一個巨大的痛苦。有一個解決方案:
..沒有這種鑄造鑄造的乏味。 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 的帖子
您能否檢查該列值是否為 null?
為了安全起見,您可以將其轉換為字符串並使用 Convert.ToInt32 方法嗎?
你能做一個權重變量,這樣你就可以調試和 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.