2014-11-24 24 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

相关问题