2010-11-27 5 views
2

사용자가 쉼표로 각 번호를 분리하여 전화 번호를 삽입하는 일반 멀티 라인 텍스트 상자를 작성하려고합니다.사용자 정의 컨트롤 엔티티 프레임 워크 바인딩

 
1111111111, 
2222222222, 
3333333333, 
4444444444, 
... 

엔티티 사용자 및 엔티티 PhoneNumber가 있습니다.

이제 phoneNumber 엔티티를 해당 컨트롤에 바인딩하고 싶습니다. 문제는이 컨트롤에서 무엇을 구현해야 바인딩 할 것인지를 이해할 수 있습니다. 예를 들어, phoneNumber를 combobox에 바인딩하면 .net은이 컨트롤에 표시하는 방법을 알고 있지만 내 경우에는 어떻게됩니까?

도움을 주셔서 감사 드리며 이와 같은 것을 만드는 방법에 대한 힌트를 제공해 주셔서 감사합니다.

안녕

+0

방금 ​​델파이에서 Oracle에 이야기하고 질문을 올렸습니다. 그녀는 어깨를 으 and하고 저를 쳐다 보았습니다. 여성들은 당신이 옳은 말을했다고 생각할 때 할 수 있지만, 향후 20 년 동안 친척들과 함께 낙오자가되었을 수도 있습니다. –

+0

hee .............? – gruber

+0

텍스트 상자 컨트롤은 개체 컬렉션에 바인딩되지 않습니다. 그것의 일대일 매핑. 문제에 대한 대안적인 접근법을 고려해야합니다. 목록 상자, gridview 등 다른 컨트롤을 사용하십시오. –

답변

1

이 콤보 상자에서 이루어집니다대로 할 수는없는 데이터베이스의 전화를 통해 코드 루프에서 다음 데이터 소스 및 데이터 멤버에 대한 특성 및 되세요. 열을 입력하고 각 항목 다음에 쉼표로 텍스트 상자에 추가하십시오. 나는 이와 비슷한 것을 구현했다.

+0

좋아,하지만 콤보 박스에서 나는 DataSource를 가지고 있으며, 제 컨트롤에서는 그렇지 않습니다. DataBindings 만 사용할 수 있습니다. 이 기사는 http://support.microsoft.com/kb/327413에서 찾을 수 있습니다. ICollection 을 제어 속성으로 설정하면 작동하지만 ICollection 이되고 싶습니다. 기본 폼에서 BindingSource를 사용하고 BindingSource.DataSource = typeof (Number)를 설정합니다. 그런 다음 코드에서 나는 BindingSource.DataSource = MyEntityContext.Number를 작성하고 bindingSource.DataSourec에 대한 제 컨트롤의 바인딩을 설정합니다.하지만 Number 클래스의 속성 만 선택할 수 있습니다. 번호는 바인드되었습니다. – gruber

0

귀하의 데이터를으로 변환하여 사용자의 시야를 확보하고 도메인으로 다시 변환하면 문제가 해결됩니다. 여기 내 프로젝트의 열거 형 프레젠테이션을 지역화 된 리소스로 변환하는 샘플 코드입니다 : 우아한 코드는 아니지만 문제를 해결할 수도 있습니다. 을 변환하면 쉼표로 숫자 컬렉션에 가입하고 컨트롤에 설정할 수 있으며 컨버팅으로 쉼표로 문자열을 분할하고 컬렉션을 빌드 할 수 있습니다.

[MarkupExtensionReturnType(typeof (IValueConverter))] 
public abstract class ConverterMarkupExtension<T> : MarkupExtension where T : class, IValueConverter, new() 
{ 
    private static T _converter; 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return _converter ?? (_converter = new T()); 
    } 
} 

public class EnumConverter<T> : ConverterMarkupExtension<EnumConverter<T>>, IValueConverter 
    where T : struct 
{ 
    #region Implemented Interfaces 

    #region IValueConverter 

    /// <summary> 
    /// convert from enum to string 
    /// </summary> 
    /// <param name = "value"></param> 
    /// <param name = "targetType"></param> 
    /// <param name = "parameter"></param> 
    /// <param name = "culture"></param> 
    /// <returns></returns> 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) 
     { 
      return null; 
     } 

     string convert = typeof(GlossaryResources).GetProperty(value.ToString()).GetValue(null, null).ToString(); 

     return new Item { Name = value.ToString(), Value = convert }; 
    } 

    /// <summary> 
    /// convert from string to enum value 
    /// </summary> 
    /// <param name = "value"></param> 
    /// <param name = "targetType"></param> 
    /// <param name = "parameter"></param> 
    /// <param name = "culture"></param> 
    /// <returns></returns> 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) 
     { 
      return null; 
     } 

     T enumvalue; 
     Enum.TryParse(value.Cast<Item>().Name, out enumvalue); 
     return enumvalue; 
    } 

    #endregion 

    #endregion 
} 

public class GenderEnumConverter : EnumConverter<Gender> 
{ 
} 
0

당신은 개체의 컬렉션을 허용하고 텍스트 상자의 '라인'속성을 래핑하는 속성이 텍스트 상자의 사용자 정의 구현을 만들 수 있습니다. 뭔가 (숫자 텍스트가 실제 텍스트를 표시하는 필드의 이름이라고 가정) :

public class NumberBox : TextBox 
    { 
     public IList<Number> Numbers 
     { 
      get 
      { 
       List<Number> numbers = new List<Number>(); 
       foreach (string line in Lines) 
       { 
        numbers.Add(new Number() 
        { 
         NumberText=line 
        }); 
       } 
       return numbers; 
      } 

      set 
      { 
       List<string> numberStrings = new List<string>(); 
       foreach (Number n in value) 
       { 
        numberStrings.Add(n.NumberText); 
       } 
       this.Lines = numberStrings.ToArray(); 
      } 
     } 
    }