2009-12-15 2 views
3

사용하려는 기능은 다음과 같습니다. - 웹 페이지 (사용자 정의 컨트롤)에서 컨트롤을 선택하고 업데이트하기위한 ObjectDataSource를 만듭니다. - DataObjectTypeName을 사용하여 데이터를 UpdateMethod로 보내는 개체를 만들 수 있습니다. - 값이 DataObjectTypeName 객체에 채워지기 전에 클래스의 사용되지 않는 항목이 0이 아닌 기본값으로 설정되지 않도록 빈 문자열을 미리 채 웁니다. 사용자가 0 또는 기본 문자열을 설정했는지 여부를 알지 못합니다. 또는 응용 프로그램에 의해.DataObjectSource에서 DataObjectTypeName 사용

값을 미리 채울 방법을 찾을 수 없습니다 (이것은 프레임 워크 2.0의 2006 년 문제였습니다). 사람들은 "왜 객체를 미리 채울 필요가 있을까요?"라고 물을 수도 있습니다. 간단한 대답은 : 서로 다른 사용자 정의 컨트롤에 무작위로 컨트롤을 배치하고 어떤 UpdateMethod가 개체의 필드를 처리해야하는지 걱정할 필요가 없기를 바랍니다.

예를 들어 이름, 성, 주소, 도시, 주, 우편 번호 필드가 포함 된 클래스 (SQL 테이블을 반영하는 클래스)가 있다고 가정 해 보겠습니다. 사용자에게 이름 및 성을 변경할 수있는 옵션을 제공하고 주소, 도시, 주, 우편 번호 (또는 그 반대)도 표시하지 않을 수도 있습니다. FirstName과 LastName을 처리하고 다른 필드가 다른 필드를 처리하는 두 개의 UpdateMethod를 생성하고 싶지 않습니다. 여러 테이블에서 40 개 이상의 열을 가진 클래스로 작업하고 있는데 한 화면에서 다른 필드가 아닌 다른 필드를 한 화면에서 다른 화면으로 변경하려고 결정할 수 있습니다.이 경우 나 없이도 UpdateMethod를 깨뜨릴 수 있습니다.

나는 내 문제를 충분히 설명하기를 바랍니다.
감사합니다.

+0

당신은 이것을 알아 냈습니까? 나는 똑같은 문제를 겪고있다. ObjectDataSource의 Inserting 이벤트 나 비슷한 것을 구현해야한다고 생각하지만 객체가 아직 생성되지 않았는지, 그리고 어떻게 접근해야하는지 알지 못합니다. –

+0

이것은 정말 짜증나는 문제입니다! ASP.NET 팀의 누군가가 이런 종류의 행동을 처리 할 수있는 방법을 찾길 바랍니다. – Jonathan

답변

0

이 문제는 거의 해결책이 아니지만, 최선의 방법입니다.

DataSourceID가 ObjectDataSource로 설정된 GridView가 있습니다.

행이 업데이트 될 때마다 객체의 속성 값이 이되도록이 선택적으로 업데이트됩니다. 즉, GridView의 열로 표시되는 경우에만 업데이트됩니다.

public static class GridViewExtensions 
{ 
    public static void EnableLimitUpdateToGridViewColumns(this GridView gridView) 
    { 
     _gridView = gridView; 
     if (_gridView.DataSourceObject != null) 
     { 
      ((ObjectDataSource)_gridView.DataSourceObject) 
       .Updating += new ObjectDataSourceMethodEventHandler(objectDataSource_Updating); 
     } 
    } 

    private static GridView _gridView; 

    private static void objectDataSource_Updating(object sender, ObjectDataSourceMethodEventArgs e) 
    { 
     var newObject = ((object)e.InputParameters[0]); 
     var oldObjects = ((ObjectDataSource)_gridView.DataSourceObject).Select().Cast<object>(); 

     Type type = oldObjects.First().GetType(); 

     object oldObject = null; 

     foreach (var obj in oldObjects) 
     { 
      if (type.GetProperty(_gridView.DataKeyNames.First()).GetValue(obj, null).ToString() == 
       type.GetProperty(_gridView.DataKeyNames.First()).GetValue(newObject, null).ToString()) 
      { 
       oldObject = obj; 
       break; 
      } 
     } 

     if (oldObject == null) return; 

     var dynamicColumns = _gridView.Columns.OfType<DynamicField>(); 

     foreach (var property in type.GetProperties()) 
     { 
      if (dynamicColumns.Where(c => c.DataField == property.Name).Count() == 0) 
      { 
       property.SetValue(newObject, property.GetValue(oldObject, null), null); 
      } 
     } 
    } 
} 

그리고 내 페이지의 후 Page_Init 이벤트

, 나는 그렇게처럼의 GridView에 적용 :
protected void Page_Init() 
{ 
    GridView1.EnableLimitUpdateToGridViewColumns(); 
} 

은 잘 작동하고

나는 다음과 같은 확장을 만들었습니다 나 순간.

비슷한 논리를 다른 컨트롤에 적용 할 수 있습니다. ListView 또는 DetailsView.

저는 현재 렌더링과 상관없는 방식으로 (즉, 사용되는 렌더링 컨트롤에 대해 알 필요가없는) 생각할 수있는 방법을 고민하고 있습니다.

해킹 할 필요없이 GridView 또는 ObjectDataSource 컨트롤의 일반적인 기능으로 끝나기를 바랍니다.