2

次のコードでデータテーブルをフィルタリングしようとしています

private void Filter(string text)
    {
        int outText=0;
        if (Int32.TryParse(text, out outText))
        {
            text = string.Empty;
        }
     DataTable DT = new DataTable();
            DT = PinCDAO.GetArea().AsEnumerable().Where(r => r.Field<int>("AreaID")==Convert.ToInt32(outText) || (r.Field<string>("AreaDescription").Contains(text))).AsDataView().ToTable();

}

「指定されたキャストは無効です」というエラーが表示されます。コードが原因です。

r => r.Field<int>("AreaID")==Convert.ToInt32(outText) 

AreaID列に整数が含まれていることは確かです

plzは私がこれを解決するのを手伝ってくれます。

4

4 に答える 4

2

コードを試す-コードでnullを処理する

AreaID」はnull許容フィールドであるためです。

DT = PinCDAO.GetArea().AsEnumerable().Where(r => 
   (Convert.IsDBNull(r["AreaID"]) ? 0 :  Convert.ToInt32(r["AreaID"])) ==outText
  || (r.Field<string>("AreaDescription").Contains(text))).AsDataView().ToTable();

このコードはnull値を簡単に処理します。

すでに私が質問に答えました:LINQのorderby句の「指定されたキャストは無効です」エラー

于 2012-07-03T06:26:48.417 に答える
1

out引数として渡される変数は、渡される前に初期化する必要はありません。さらに、outtextはすでにInt32であるため、Int32に変換する必要はありません。

private void Filter(string text)     {      
   int outText;         
          if (Int32.TryParse(text, out outText))        
                  { 
                    // text was integer and parsed successfully.            
                    text = string.Empty;       
                   }     
 DataTable DT = new DataTable();  
           DT = PinCDAO.GetArea().AsEnumerable().Where(r => r.Field<int>("AreaID")== outText || (r.Field<string>("AreaDescription").Contains(text))).AsDataView().ToTable();  } 
于 2012-07-03T06:25:51.887 に答える
1

Convert.ToInt32を削除します。outTextはすでにintとして解析されています。 if (Int32.TryParse(text, out outText))

DT = PinCDAO.GetArea().AsEnumerable()
          .Where(r => r.Field<int>("AreaID")==outText 
                           || (r.Field<string>("AreaDescription")
           .Contains(text))).AsDataView().ToTable();

例外が発生する理由は、「AreaID」にint値が含まれていない可能性があるためです。

于 2012-07-03T06:22:32.670 に答える
1

すでに宣言さintれているように変換する必要はありません....次の方法で簡単に使用できます。outTextintoutText

r => r.Field<int>("AreaID")==outText 

次の方法で表現を変更できます。

 r => Convert.ToInt32(r["AreaID"])==outText 
于 2012-07-03T06:25:30.923 に答える