1
<
DataGrid
x:Name
="DataGrid"
AutoGenerateColumns
="False"
Visibility
="Visible"
IsReadOnly
="False"
VerticalAlignment
="Top"
Height
="307"
Canvas.Left
="208"
Canvas.Top
="15"
Width
="280"
>
2 < DataGrid.Columns >
3 < DataGridTextColumn Header ="星期一" Binding =" {Binding 星期一} " Width ="100" />
4 < DataGridTextColumn Header ="星期二" Binding =" {Binding 星期二} " Width ="70" />
5 < DataGridTextColumn Header ="星期三" Binding =" {Binding 星期三} " />
6 < DataGridTextColumn Header ="星期四" Binding =" {Binding 星期四} " />
7 < DataGridTextColumn Header ="星期五" Binding =" {Binding 星期五} " />
8 < DataGridTextColumn Header ="星期六" Binding =" {Binding 星期六} " />
9 < DataGridTextColumn Header ="星期天" Binding =" {Binding 星期天} " />
10 </ DataGrid.Columns >
11 </ DataGrid >
2 < DataGrid.Columns >
3 < DataGridTextColumn Header ="星期一" Binding =" {Binding 星期一} " Width ="100" />
4 < DataGridTextColumn Header ="星期二" Binding =" {Binding 星期二} " Width ="70" />
5 < DataGridTextColumn Header ="星期三" Binding =" {Binding 星期三} " />
6 < DataGridTextColumn Header ="星期四" Binding =" {Binding 星期四} " />
7 < DataGridTextColumn Header ="星期五" Binding =" {Binding 星期五} " />
8 < DataGridTextColumn Header ="星期六" Binding =" {Binding 星期六} " />
9 < DataGridTextColumn Header ="星期天" Binding =" {Binding 星期天} " />
10 </ DataGrid.Columns >
11 </ DataGrid >
AutoGenerateColumns="False"这个很重要,曾在这个问题上绕很长时间,如果该属性为true既允许插入列标题那结果会是在原来的列后面在加同样的一列。
上面是使用的 <DataGridTextColumn/>给DataGrid添加的固定列标题名,这里注意后面的 Header="星期一" Binding="{Binding 星期一} 其中Binding{}就是关键的数据绑定的那块,这里在{}里的内容就是我们要在C#中定义的结构体或其他的成员名,两者必须一致。下面贴一下 定义的结构体共2个:
1
public
struct
ProgramStruct
2 {
3 [MarshalAs (UnmanagedType.ByValArray, SizeConst = 50 )] public char [] name; // c char[]
4 public int NumberOf; // c int
5 public uint Fre; // c unsigned long
6 public ushort ser; // c unsigned short
7 public byte sta; // c unsigned char
8 public char nt; // c char
9 public byte dem; // c unsigned char
10 public ushort Servi;
11 [MarshalAs (UnmanagedType.ByValArray, SizeConst = 200 )] public char [] net; // c char[]重点在C#里的指定大小的数组定义
12 public int mf; // c int
13 public int Bandwid; // c int
14 public bool bChe; // c bool
15 }
2 {
3 [MarshalAs (UnmanagedType.ByValArray, SizeConst = 50 )] public char [] name; // c char[]
4 public int NumberOf; // c int
5 public uint Fre; // c unsigned long
6 public ushort ser; // c unsigned short
7 public byte sta; // c unsigned char
8 public char nt; // c char
9 public byte dem; // c unsigned char
10 public ushort Servi;
11 [MarshalAs (UnmanagedType.ByValArray, SizeConst = 200 )] public char [] net; // c char[]重点在C#里的指定大小的数组定义
12 public int mf; // c int
13 public int Bandwid; // c int
14 public bool bChe; // c bool
15 }
上面这个是咱们调用dll里的接口需要的参数结构定义。
1
public
struct
ProgramStruct2
2 {
3 public string 星期一{ get ; set ;}
2 {
3 public string 星期一{ get ; set ;}
4
public
string
星期二{
get
;
set
;}
5 public ushort 星期三{ get ; set ;}
6 public uint 星期四{ get ; set ;}
7 public byte 星期五{ get ; set ;}
8 public int 星期六{ get ; set ;}
9 public int 星期天{ get ; set ;}
10 }
5 public ushort 星期三{ get ; set ;}
6 public uint 星期四{ get ; set ;}
7 public byte 星期五{ get ; set ;}
8 public int 星期六{ get ; set ;}
9 public int 星期天{ get ; set ;}
10 }
这里注意那个{get;set;}也是获取值的关键。
下面就是根据咱们使用的数组大小定义上面结构体的数组了以及取值。
1
int
count
=
ImportInterface.GetProgramCount();//调用DLL库里获取文件的个数的接口
5
6 int size = Marshal.SizeOf( typeof (ImportInterface.ProgramStruct)) * count;
7 IntPtr pBuff = Marshal.AllocHGlobal(size);
8 ImportInterface.GetProgramList(pBuff); //调用库获取文件(其中库统一放在ImportInterface.cs里)
9 List < ProgramStruct2 > service = new List < ProgramStruct2 > ();
10 ImportInterface.ProgramStruct[] pClass = new ImportInterface.ProgramStruct[count];
11 ProgramStruct2 ps = new ProgramStruct2();
12
13 for ( int i = 0 ; i < count; i ++ )
14 {
15 IntPtr pPonitor = (IntPtr)(pBuff.ToInt32() + Marshal.SizeOf( typeof (ImportInterface.ProgramStruct)) * i);
16 pClass[i] = (ImportInterface.ProgramStruct)Marshal.PtrToStructure(pPonitor, typeof (ImportInterface.ProgramStruct));
17 ps.星期一 = new string (pClass[i].net);
18 ps.星期二 = new string (pClass[i].name);
19 ps.星期三 = pClass[i].servi;
20 ps.星期四 = pClass[i].Fre;
21 ps.星期五 = pClass[i].sta;
22 ps.星期六 = ( int )pClass[i].nt;
23 ps.星期天 = pClass[i].mf;
24 service.Add(ps);//关键
25
5
6 int size = Marshal.SizeOf( typeof (ImportInterface.ProgramStruct)) * count;
7 IntPtr pBuff = Marshal.AllocHGlobal(size);
8 ImportInterface.GetProgramList(pBuff); //调用库获取文件(其中库统一放在ImportInterface.cs里)
9 List < ProgramStruct2 > service = new List < ProgramStruct2 > ();
10 ImportInterface.ProgramStruct[] pClass = new ImportInterface.ProgramStruct[count];
11 ProgramStruct2 ps = new ProgramStruct2();
12
13 for ( int i = 0 ; i < count; i ++ )
14 {
15 IntPtr pPonitor = (IntPtr)(pBuff.ToInt32() + Marshal.SizeOf( typeof (ImportInterface.ProgramStruct)) * i);
16 pClass[i] = (ImportInterface.ProgramStruct)Marshal.PtrToStructure(pPonitor, typeof (ImportInterface.ProgramStruct));
17 ps.星期一 = new string (pClass[i].net);
18 ps.星期二 = new string (pClass[i].name);
19 ps.星期三 = pClass[i].servi;
20 ps.星期四 = pClass[i].Fre;
21 ps.星期五 = pClass[i].sta;
22 ps.星期六 = ( int )pClass[i].nt;
23 ps.星期天 = pClass[i].mf;
24 service.Add(ps);//关键
25
}
39
40 Marshal.FreeHGlobal(pBuff);
41 DataGrid.ItemsSource = service;//关键_这里的DataGrid是DataGrid的ID
39
40 Marshal.FreeHGlobal(pBuff);
41 DataGrid.ItemsSource = service;//关键_这里的DataGrid是DataGrid的ID
列一下ImportInterface.cs的库的引入:
1
[DllImport(
"
LOVI.dll
"
)]
2 public static extern int GetProgramCount( );
2 public static extern int GetProgramCount( );
3
4 [DllImport("LOVI.dll", CharSet = CharSet.Ansi)]
5 public static extern void GetProgramList(IntPtr ps);//ProgramStruct *ps
5 public static extern void GetProgramList(IntPtr ps);//ProgramStruct *ps
引入库dll要加头文件 using System.Runtime.InteropServices;
搞定,其中的有关结构体的成员的名字由于是实际项目所以对其中的命名有所改动!!!