Mur*_*uga 3 c# sql-server datatable list
我正在尝试使用TextChanged()事件在文本框中填充SQL Server中的自动填充文本。 [WindowsForm, C#]
我有部分课程表格
TextChanged事件:
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;
}
Run Code Online (Sandbox Code Playgroud)
调用此方法时遇到此错误CustomerName.ConvertDataTableToList()。
无法从用法中推断方法'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;
}
Run Code Online (Sandbox Code Playgroud)
客户名称类别:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
当我调试应用程序时,将执行查询并成功生成结果。但是我无法将数据表结果加载为列表。
欢迎对此转换提出可能的建议。
因此,您想将DataTable转换为某种类型的对象列表。对?
通用方法T仅从参数推断通用类型。由于没有类型的参数,T因此需要显式指定它。因此,当您编写此行时:
List<string> listNames = CustomerName.ConvertDataTableToList(dt);
Run Code Online (Sandbox Code Playgroud)
编译器无法推断T您想要的类型是什么,string因为它仅用于返回类型。因此,您需要明确指定:
CustomerName.ConvertDataTableToList<string>(dt);
Run Code Online (Sandbox Code Playgroud)
但是,由于您指定了condition where T : new(),这意味着泛型类型应具有无参数构造函数,string不满足要求。您正在按名称匹配该行,因此唯一的选择是修改通用方法或创建这样的类:
public class CustomerNameHolder
{
public string Name { set; get; }
}
Run Code Online (Sandbox Code Playgroud)
然后:
List<string> listNames = CustomerName.ConvertDataTableToList<CustomerNameHolder>(dt)
.Select(x=> x.Name).ToList();
Run Code Online (Sandbox Code Playgroud)