2016-07-17 16 views
2

TextChanged()イベントを使用して、テキストボックスにSQL Serverからオートコンプリートテキストを挿入しようとしています。 [WindowsForm, C#]メソッドの型引数は、その使用法から推論できません。明示的に型引数を指定してみてください

私は部分クラスフォーム

TextChangedイベントがあります。私は、このメソッドCustomerName.ConvertDataTableToList()を呼び出すときに、私はこのエラーを取得しています

private void textBoxFilterCName_TextChanged(object sender, EventArgs e) 
    { 
     DataTable dt = FillCustomerName(textBoxFilterCName.Text); 
     List<string> listNames = CustomerName.ConvertDataTableToList(dt); 
     textBoxFilterCName.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
     AutoCompleteStringCollection dataName = new AutoCompleteStringCollection(); 
     dataName.AddRange(listNames.ToArray()); 
     textBoxFilterCName.AutoCompleteCustomSource = dataName; 
     textBoxFilterCName.AutoCompleteSource = AutoCompleteSource.CustomSource; 
    } 

を。

メソッド 'CustomerName.ConvertDataTableToList(DataTable)'の型引数は、その用途から推論できません。型引数を明示的に指定してみてください。

FillCustomerName()メソッド

public DataTable FillCustomerName(string cName) 
    { 
     DataTable dtName = new DataTable(); 
     List<string> listName = new List<string>(); 
     try 
     { 
      dbconnection.Open(); 
      string query = "SELECT [Name] FROM Customers WHERE Is_Active=1 AND Name like @CName + '%'"; 
      using (SqlCommand cmd = new SqlCommand(query, dbconnection)) 
      { 
       cmd.Parameters.Add("CName", SqlDbType.VarChar).Value = cName; 
       dtName.Load(cmd.ExecuteReader()); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Connection Error"); 
     } 
     finally 
     { 
      dbconnection.Close(); 
     } 
     return dtName; 
    } 

CustomerNameのクラス:

public static class CustomerName 
{ 
    private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new() 
    { 
     T item = new T(); 
     foreach (var property in properties) 
     { 
      if (property.PropertyType == typeof(System.DayOfWeek)) 
      { 
       DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), row[property.Name].ToString()); 
       property.SetValue(item, day, null); 
      } 
      else 
      { 
       property.SetValue(item, row[property.Name], null); 
      } 
     } 
     return item; 
    } 
    public static List<T> ConvertDataTableToList<T>(this DataTable table) where T : new() 
    { 
     IList<PropertyInfo> properties = typeof(T).GetProperties().ToList(); 
     List<T> result = new List<T>(); 

     foreach (var row in table.Rows) 
     { 
      var item = CreateItemFromRow<T>((DataRow)row, properties); 
      result.Add(item); 
     } 
     return result;    
    } 
} 

クエリが実行されると、私は、アプリケーションをデバッグするときの結果が正常に生成されます。しかし、私はリストとしてdatatable結果を読み込むことができませんでした。

この変換の可能な提案は大歓迎です。

答えて

3

したがって、DataTableを特定の種類のオブジェクトのリストに変換する必要があります。右?

汎用メソッドは、汎用タイプTをパラメータのみから推測します。タイプTのパラメータがないので、明示的に指定する必要があります。あなたはこの行を記述するときに:

List<string> listNames = CustomerName.ConvertDataTableToList(dt); 

コンパイラは、それが唯一の戻り値の型で使用されているので、あなたがしたいTタイプがstringであることを何を推測することはできません。だから、明示的に指定する必要があります。

CustomerName.ConvertDataTableToList<string>(dt); 

をただし、あなたが条件where T : new()を指定するので、これは一般的なタイプは、パラメータなしのコンストラクタを持たなければならないこと、文字列はそれを満たしていません。その後

public class CustomerNameHolder 
{ 
    public string Name { set; get; } 
} 

List<string> listNames = CustomerName.ConvertDataTableToList<CustomerNameHolder>(dt) 
            .Select(x=> x.Name).ToList(); 
+0

をそれは、このエラー{「文字列」を示している唯一のオプションは、一般的な方法を変更したり、このようなクラスを作成することですので、あなたは、名前の列に一致していますジェネリック型またはメソッド 'CustomerName.ConvertDataTableToList (DataTable)'} – Muruga

+0

@Murugaでパラメータ 'T'として使用するには、パブリックパラメータレスコンストラクタを持つ非抽象型でなければなりません。 ) 'これは、' T'型がパラメータのないコンストラクタを持つべきであることを意味します。文字列はそれを持っていません。 – user3185569

+1

すごく!フラッシュで働いた。タイプに関する情報をありがとう。 – Muruga

関連する問題