2011-09-04 4 views
3

C#의 checkedListBox에 추가 할 수있는 개체를 갖고 싶습니다. 개체가 목록에 표시되는 자체 문자열을 생성 할 수있게하려고합니다. . 나는 an example of what I want to do in visual basic을 찾았다.CheckListBox - 개체를 추가하고 그 개체에 텍스트 표시하는 방법

그러나 저는 C#으로하는 방법을 알 수 없습니다. 나는 내 자신의 클래스를 구현하기 위해 노력했습니다 :

public class Device { 
    String s; 

    public Device() { 
     s = new String("test".ToCharArray()); 

    } 

    public String toString() { 
     return s; 
    } 
} 

을하지만 그것을 실행할 때, 그것은 어떤 제안을 감상 할 수있다

.. 테스트하지 목록에서 "WindowsFormsApplication2.Device"를 표시합니다.

감사합니다, 레자

추신 체크리스트 박스에 각 항목에 대한 텍스트와 진행 표시 줄을 표시 할 수 있습니까?

+0

당신은 p.s. 전혀 다른 종류의 문제이며, 자기 자신에 의한 질문을 보증합니다. 여기 비슷한 것을 시도한 누군가가 거기를 보았습니다. http://social.msdn.microsoft.com/Forums/en/winforms/thread/24b9ec32-f082-4895-a3b7-9ef882b6a74d – albertjan

답변

5

올바르게 Object.ToString() 가상 메서드를 재정의되지 않습니다

  1. 방법-name이 (C 번호는 대소 문자를 구분) 잘못 철자가.
  2. 메서드의 override 수정자가 없습니다. 이것은 이 필요합니다. 가상 메소드를 오버 라이딩하는 경우이 필요합니다.

하면이 방법을 수행

public override string ToString() 
{ 
    return s; 
} 
1

수 있도록이 같은 당신의 toString 메소드 : 그것이 있어야 할 때 진짜 문제는 CamelCase를 toString이라고 정확하게 지적 the_ajp

public override string ToString(){ 
    return s; 
} 
+0

나는 그것을 시험해 보았으나, '적절한 방법이 없어졌다'는 말을했다. String으로 하위 클래스를 만들려고했으나 그 중 하나가 마음에 들지 않았습니다. – reza

+0

ToString이 대문자 T로 시작한다는 점에 유의하십시오. – albertjan

+0

은 'ToString'이 아니라 'ToString'이 아니라는 것을 놓쳤습니다. – reza

1

PascalCase ToString. 또한

public override String ToString() { 
    return s; 
} 

는 C#을 코딩 할 때 s = new String("test".ToCharArray()); 그냥 s = "test";해야 자바 예제를 보지 않는다.

+0

toString은 Object.ToString()에서 ToString이어야합니다. – albertjan

+0

오, 맞아요. hahah :) 다른 이유가 없습니다. C#을 코딩 할 때 Java 예제를 살펴보십시오. 나는 내 대답을 시정하지만 당신을 상향 조정합니다. –

0

당신은 이미 답을 가지고 있지만, 여기에 내가 좋아하는 트릭이 있습니다. 귀하의 모델에서 ToString() 메서드를 사용하는 것에 대해 싫어하는 점은 그것이 bussiness와 view logic을 혼합한다는 것입니다.

대신 모델 개체에 대한 참조를 유지하고 자체 ToString 메서드를 제공하는 래퍼 클래스 (어댑터 디자인 패턴)를 만듭니다. 이것을 익명 함수와 결합하여 표시되는 문자열의 정확한 표시 방법을 지정할 수 있습니다 (다른 목록 상자에 약간 다른 문자열을 표시 할 수 있습니다).

래퍼 클래스는 다음과 같이 수 :

class ListBoxWrapper<T> 
{ 
    private T obj; 
    private Func<T, string> stringFunction; 

    public ListBoxWrapper(T obj, Func<T, string> stringFunction) 
    { 
     this.obj = obj; 
     this.stringFunction = stringFunction; 
    } 

    public override string ToString() 
    { 
     return stringFunction(obj); 
    } 
} 

간단하게, 당신은 여전히 ​​할 수있는 모델의 ToString()를 사용하려면 :

ListBox.Items.Add(new ListBoxWrapper<Device>(device, dev => dev.ToString())); 

그러나 당신은 또한 (예를 들어) 할 수 :

ListBox.Items.Add(new ListBoxWrapper<Device>(device, dev => dev.SerialNumber.ToString())); 

이 기능을 더욱 유용하게 사용하려면 ListBox 또는 CheckedListBox에서 파생 된 고유 한 클래스를 만들 수 있습니다. 자동으로 개체를 래핑합니다. 이렇게하면 각 개별 항목 대신 ListBox에 저장된 문자열 함수를 사용할 수도 있습니다.

+0

Honza님께, 나는 당신이 의미하는 것을 정말로 이해하지 못하기 때문에 샘플 코드를 제공해 주시겠습니까? [더 유용하게 만들려면 ListBox 또는 CheckedListBox에서 파생 된 클래스를 만들어서 자동으로 객체를 래핑하십시오. 그런 식으로 각 개별 항목 대신 ListBox에 저장된 문자열 함수를 가질 수도 있습니다. 미리 감사드립니다. DH –

+0

Ok, 빠른 답변. 이 코드는 설명을위한 것일 뿐이므로 테스트를하지 않았으며 의미 한 바를 설명하기 위해 작성했습니다. 가이 같은 것 할 수있는 가장 간단한 방법 : \t 클래스 CustomListBox : 목록 상자 { \t \t 공공 Func을 stringFunction {얻을; 세트; } \t \t 공공 무효의 addItem를 (T 항목) { \t \t \t this.Items.Add (새 ListBoxWrapper (항목, stringFunction)); \t \t} \t} – Honza

관련 문제