2014-11-24 1 views
1

Dunno do not do do this about this? 아래 구조의 내용은 다른 곳에서 정의됩니다. 코드를 실행하면 4 개의 0을 출력합니다. 어떤 도움을 크게 주시면 감사하겠습니다 .....C# windows 폼 응용 프로그램의 목록 상자에 구조체의 내용을 표시하는 방법

public class NativeMethods 
{ 

    public struct FT_DEVICE_LIST_INFO_NODE 
    { 
     public uint ID; 
     public uint LocId;  
     public string SerialNumber;   
     public string Description; 
    } 

    [DllImportAttribute(@"C:\Users\Brendan\Documents\libMPSSE.dll", EntryPoint = "SPI_GetNumChannels")] 
    public static extern uint SPI_GetChannelInfo(uint index, ref FT_DEVICE_LIST_INFO_NODE chanInfo); 
} 



public partial class Form1 : Form 
{ 
    List<uint> items = new List<uint>(); 

    public Form1() 
    { 

     InitializeComponent(); 

     NativeMethods.FT_DEVICE_LIST_INFO_NODE devlist = new NativeMethods.FT_DEVICE_LIST_INFO_NODE(); 

     for(uint x=0;x<4;x++) 
     { 

     index = 0; 
     items.Add(NativeMethods.SPI_GetChannelInfo(index, ref devlist)); 

     } 
     listBox.DataSource = items; 
    } 
} 
+0

extern 함수 SPI_GetChannelInfo에 DllImport 속성이 있습니까? extern 코드를 디버깅하려고 했습니까 (가능한 경우)? –

+0

예 C DLL을 가져옵니다, 나는 그것이 작동하는 것을 알고 있습니다 다른 텍스트 상자에 내용을 출력했습니다. 내가 목록 상자에 모든 매개 변수를 출력하는 것,하지만 어쩌면 이것이 서로 다른 유형의 매개 변수를 uint와 문자열이기 때문에 어떨까요? – john

+0

좀 더 간단하게하기 위해 DLLimport 속성을 생략했습니다. – john

답변

1

구조가 다른 곳에 정의되어 있다고 썼다는 이유로 나는 그것을 바꿀 수 없습니다.

class FT_DEVICE_wrapper 
{ 
    public FT_DEVICE_LIST_INFO_NODE INFO_NODE { get; set; } 

    public FT_DEVICE_wrapper(FT_DEVICE_LIST_INFO_NODE data_) 
    { INFO_NODE = data_; } 

    public override string ToString() 
    { 
     return string.Format("ID = {0} LocID = {1} SNr = {2} ({3}) ", 
      INFO_NODE.ID, INFO_NODE.LocId, INFO_NODE.SerialNumber, INFO_NODE.Description); 
    } 

} 

지금이 같은 래퍼의 인스턴스를 추가 할 수 있습니다 :

사용자 정의 만든 표시 문자열을 얻을 수있는 일반적인 방법은 아마도 이런 최소한의 클래스에 구조 ,이다

private void button1_Click(object sender, EventArgs e) 
{ 
    FT_DEVICE_LIST_INFO_NODE N1 = new FT_DEVICE_LIST_INFO_NODE(); 
    N1.ID = 1; 
    N1.LocId = 1001; 
    N1.SerialNumber = "123-456-00"; 
    N1.Description = "test 01"; 
    FT_DEVICE_wrapper W1 = new FT_DEVICE_wrapper(N1); 

    listBox1.Items.Add(W1); 

} 

구조체의 데이터는 출력 문자열의 형식에 관계없이 표시됩니다.

그리고이

Console.WriteLine(((FT_DEVICE_wrapper) listBox1.Items[0]).INFO_NODE.Description); 

또는 같은 항목을 캐스팅하여 구조에 액세스 할 수 있습니다 IMO 조금 더 나은이 같은 :

FT_DEVICE_LIST_INFO_NODE node = ((FT_DEVICE_wrapper)listBox1.Items[0]).INFO_NODE; 
Console.WriteLine(node.SerialNumber); 

당신 ListViews에보고하는 것이 좋습니다, 지원 열; 여기에 구조를 추가하는 방법은 날짜 필드 중 일부를 별도의 열에 넣으려는 경우와 완전히 다릅니다. 당신은 적절한 목록 작성하여 시작 데이터 바인딩을 사용하려면

:

List<FT_DEVICE_wrapper> items = new List<FT_DEVICE_wrapper>(); 

및 다음

listBox1.Items.Add(W1); 

items.Add(W1); 
listBox1.DataSource = items; 

로 교체 참고 : 단순히 ToString를 추가 원래 구조로 메소드를 차가운 또한 구조 표시 잘 ListBox 포장되지 않고 있습니다.

+0

고마워요!그것은 매우 도움이되었지만, 아직 당신을 업 프리뷰 할 수있는 담당자가 충분하지 않습니다. – john