데이터를 Gridview 정렬 이벤트에 공급하는 기본 SQL 쿼리를 수행합니다.열 오류를 생성하지 않고 gridview 데이터 소스에 개체 목록을 전달하는 방법
public DataTable GetDataDataTableGeneric()
{
string query = "SELECT * FROM Gamer";
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["AzureServer"].ConnectionString);
conn.Open();
SqlCommand cmd = new SqlCommand(query, conn);
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
conn.Close();
return dt;
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
// string query= e.SortExpression + " " + GetSortDirection(e.SortExpression);
// e.SortExpression;
DataTable dt = GetDataDataTableGeneric();
dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
List<DataRow> list = dt.AsEnumerable().ToList();
GridView1.DataSourceID = null;
GridView1.DataSource = list;
GridView1.DataBind();
}
데이터 소스는 열거되지 않는 개체를 허용하지 않기 때문에 데이터 테이블을 목록으로 변환하기로 결정했습니다.
'System.Data.DataRow' does not contain a property with the name 'Id'.
오류 목록을 생성하고 방지 할 수있는 방법이 있나요 :
그러나, 나는이 오류가?
UPDATE 기능 :
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
DataTable dt = GetDataDataTableGeneric();
dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
// List<Gamer> list = dt.AsEnumerable().ToList();
List<Gamer> list = (from DataRow row in dt.Rows
select new Gamer
{
//assign properties here
Id = Convert.ToInt32(row["Id"]),
UserID = Convert.ToInt32(row["UserID"]),
Level = Convert.ToInt32(row["Level"]),
Loyalty = Convert.ToInt32(row["Loyalty"]),
Experience = Convert.ToInt32(row["Experience"]),
OverallPoints = Convert.ToInt32(row["OverallPoints"]),
OverallBets = Convert.ToInt32(row["OverallBets"]),
Login = row["Login"].ToString()
}).ToList();
GridView1.DataSourceID = null;
GridView1.DataSource = list;
GridView1.DataBind();
}
오류
The data source does not support sorting.
는 다음과 같은 솔루션도 실패했습니다. 동일한 정렬 문제가 발생합니다.
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
DataTable dt = GetDataDataTableGeneric();
dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
List<Gamer> list = (from DataRow row in dt.Rows
select new Gamer
{
//assign properties here
Id = Convert.ToInt32(row["Id"]),
UserID = Convert.ToInt32(row["UserID"]),
Level = Convert.ToInt32(row["Level"]),
Loyalty = Convert.ToInt32(row["Loyalty"]),
Experience = Convert.ToInt32(row["Experience"]),
OverallPoints = Convert.ToInt32(row["OverallPoints"]),
OverallBets = Convert.ToInt32(row["OverallBets"]),
Login = row["Login"].ToString()
}).ToList();
DataTable dt2 = ConvertToDataTable(list);
GridView1.DataSourceID = null;
GridView1.DataSource = dt2;
GridView1.DataBind();
}
private DataTable ConvertToDataTable<T>(IList<T> data)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
foreach (PropertyDescriptor prop in properties)
{
table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
}
foreach (T item in data)
{
DataRow row = table.NewRow();
foreach (PropertyDescriptor prop in properties)
{
row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
}
table.Rows.Add(row);
}
return table;
}
다음 솔루션은 너무 일을 실패했습니다
string cmd = "SELECT * FROM Gamer ORDER BY "+ e.SortExpression + " " + GetSortDirection(e.SortExpression);
DataSet ds = new DataSet();
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlDataAdapter sqlAdapter = new SqlDataAdapter(cmd, connection);
sqlAdapter.Fill(ds);
}
GridView1.DataSource = ds;
GridView1.DataBind();
이전에이 솔루션을 사용했습니다. 이렇게하면 오류가 '데이터 원본 doesnt 지원 정렬'입니다. 이는 데이터 소스 속성이 IEnumberable 인 클래스를 허용하기 때문입니다. 그게 내가 캐스팅을 사용한 이유 야. 게이머 클래스를 만들었지 만 캐스팅 문제가 있습니다. 목록 목록 = dt.AsEnumerable(). ToList(); 그 변환 및 SQL 지식에 대한 내 linq 좋은 방법을 잘 모릅니다. –