2017-11-23 1 views
0

데이터를 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(); 

답변

0

를 그 지정을 위해 당신이 함수를 사용할 수 있습니다 사용할 수 있습니다 당신이 필요로하는 모든 일은 빈 eventhandler를 넣는 것입니다.

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
     {} 
0

이 말이되지 않습니다가, 무슨 일이 실제로 List<DataRow>로 변환하여 이루어지고 있으며 List<Gamer>로 변환되지 않으므로이 그런 식으로 일하지 않았다.

GridView1.DataSource = dt; 
GridView1.DataBind(); 

을하거나 다른 방법은 주위에 당신의 테이블에 대해 DTO 될 것 클래스 만드는 것입니다 :

할 수있는 일을 직접 데이터 테이블에 바인딩되어 다음

public class Gamer 
{ 
    public int Id {get;set;} 
} 

과 귀하의 코드는 DataTable에서 List<Gamer>을 만들거나 데이터 액세스에서 직접 List<Gamer>을 반환 할 수 있습니다.

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
{ 

    DataTable dt = GetDataDataTableGeneric(); 
    dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression); 

    GridView1.DataSource = dt; 
    GridView1.DataBind(); 
} 

는 희망이 도움이 : 첫 번째 접근 방식을 따르는 경우

귀하의 방법 코드는 다음과 같을 것이다.

+0

이전에이 솔루션을 사용했습니다. 이렇게하면 오류가 '데이터 원본 doesnt 지원 정렬'입니다. 이는 데이터 소스 속성이 IEnumberable 인 클래스를 허용하기 때문입니다. 그게 내가 캐스팅을 사용한 이유 야. 게이머 클래스를 만들었지 만 캐스팅 문제가 있습니다. 목록 목록 = dt.AsEnumerable(). ToList(); 그 변환 및 SQL 지식에 대한 내 linq 좋은 방법을 잘 모릅니다. –

0

당신은 몇 가지 옵션이 있지만 가장 쉬운

DataTable dt = GetDataDataTableGeneric(); 
    dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression); 
GridView1.DataSource = dt.DefaultView.ToTable(); 
    GridView1.DataBind(); 

또는 동적으로 쿼리에서 테이블을 만들고 다음의 GridView

로 만들 이상하게
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
        NorthwindEntities entity = new NorthwindEntities(); 
        var db1 = (from ordermst in entity.Orders 
                    where ordermst.ShipCountry.Equals("Finland") 
                    select new 
                    { 
                        CustomerID = ordermst.CustomerID, 
                        OrderID = ordermst.OrderID 
                    }).Take(10).ToList(); 
        DataTable dt = ConvertToDataTable(db1); 
        GvOrder.DataSource = dt; 
        GvOrder.DataBind(); 
  
        DataTable dt1 = new DataTable(); 
        dt1 = GvOrder.DataSource as DataTable; 
        GvOrder1.DataSource = dt1; 
        GvOrder1.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; 
} 
+0

이 오류가 발생했습니다. 데이터 소스가 정렬을 지원하지 않습니다. 코드 조각 두 개를 사용한 후에. 두 번째 솔루션은 위의 대답에서 업데이트되었습니다. –

관련 문제