2014-11-24 26 views
1

如果我對此有正確的解決方法,不知道該怎麼辦?以下結構的內容在其他地方定義。當我運行代碼時,它只是輸出一個4個零的列表。任何幫助將不勝感激.....如何在c#窗體窗體應用程序中的列表框中顯示結構的內容

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

你的外部函數SPI_GetChannelInfo是否具有DllImport屬性?你有沒有嘗試調試外部代碼(如果可以的話)? – 2014-11-24 13:41:23

+0

是的,它導入一個C DLL,我知道它是作爲 我已經輸出其內容到其他文本框。我似乎無法將所有參數輸出到列表框中,也許這是因爲它們是不同類型的參數uint和string? – john 2014-11-24 13:49:12

+0

我離開了DllImport屬性,使其更簡單 – john 2014-11-24 13:55:01

回答

1

既然你寫的,你的結構定義在其他地方我asume你不能改變它。

通常的方式來獲得一個定製的顯示字符串是包裝在最小的類的結構,也許是這樣的:

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); 

或者訪問結構海事組織好一點這樣的:

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 2014-11-25 10:17:53

相關問題