C# 为什么这种方法没有';不行?

C# 为什么这种方法没有';不行?,c#,winforms,listview,C#,Winforms,Listview,我想在列表视图的标题中显示一个排序箭头,我发现: 它是有效的 我试图将代码修改为: const Int32 HDF_SORTDOWN = 0x200; const Int32 HDF_SORTUP = 0x400; const Int32 HDI_FORMAT = 0x4; const Int32 HDM_GETITEM = 0x120b; const Int32 HDM_SETITEM = 0x120c; const Int32 LVM_GETHEADER = 0x101f; [DllI

我想在列表视图的标题中显示一个排序箭头,我发现:

它是有效的

我试图将代码修改为:


const Int32 HDF_SORTDOWN = 0x200;
const Int32 HDF_SORTUP = 0x400;
const Int32 HDI_FORMAT = 0x4;
const Int32 HDM_GETITEM = 0x120b;
const Int32 HDM_SETITEM = 0x120c;
const Int32 LVM_GETHEADER = 0x101f;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "SendMessage")]
static extern IntPtr SendMessageLVCOLUMN(IntPtr hWnd, UInt32 msg, IntPtr wParam, ref LVCOLUMN lParam);

struct LVCOLUMN
{
    public UInt32 mask;
    public Int32 fmt;
    public Int32 cx;
    public String pszText;
    public Int32 cchTextMax;
    public Int32 iSubItem;
    public Int32 iImage;
    public Int32 iOrder;
    public Int32 cxMin;
    public Int32 cxDefault;
    public Int32 cxIdeal;
}

private void SetSortIcon(ListView lstVw, int column, SortOrder sorting)
{
    IntPtr clmHdr = SendMessage(lstVw.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero);

    for (int i = 0; i < lstVw.Columns.Count; i++)
    {
        IntPtr clmPtr = new IntPtr(i);
        LVCOLUMN lvColumn = new LVCOLUMN();

        lvColumn.mask = HDI_FORMAT;
        SendMessageLVCOLUMN(clmHdr, HDM_GETITEM, clmPtr, ref lvColumn);
        if (sorting != SortOrder.None && i == column)
        {
            if (sorting == SortOrder.Ascending)
            {
                lvColumn.fmt &= ~HDF_SORTDOWN;
                lvColumn.fmt |= HDF_SORTUP;
            }
            else
            {
                lvColumn.fmt &= ~HDF_SORTUP;
                lvColumn.fmt |= HDF_SORTDOWN;
            }
        }
        else
        {
            lvColumn.fmt &= ~HDF_SORTDOWN & ~HDF_SORTUP;
        }
        SendMessageLVCOLUMN(clmHdr, HDM_SETITEM, clmPtr, ref lvColumn);
    }
}

常数Int32 HDF_SORTDOWN=0x200;
常量Int32 HDF_SORTUP=0x400;
常量Int32 HDI_格式=0x4;
const Int32 HDM_GETITEM=0x120b;
常量Int32 HDM_SETITEM=0x120c;
const Int32 LVM_GETHEADER=0x101f;
[DllImport(“user32.dll”,CharSet=CharSet.Auto)]
静态外部IntPtr发送消息(IntPtr hWnd、UInt32消息、IntPtr wParam、IntPtr LPRAM);
[DllImport(“user32.dll”,CharSet=CharSet.Auto,EntryPoint=“SendMessage”)]
静态外部IntPtr SendMessageLVCOLUMN(IntPtr hWnd、UInt32 msg、IntPtr wParam、ref LVCOLUMN lParam);
结构LVCOLUMN
{
公共UInt32面罩;
公共Int32 fmt;
公共Int32 cx;
公共字符串pszText;
公共Int32 cchTextMax;
公共Int32 iSubItem;
公共Int32 iImage;
公共利益;
公共Int32 cxMin;
公共Int32默认;
理想的公共Int32;
}
私有void SetSortIcon(ListView lstVw、int列、排序器排序)
{
IntPtr clmHdr=SendMessage(lstVw.Handle、LVM_GETHEADER、IntPtr.Zero、IntPtr.Zero);
对于(int i=0;i
这不管用

原始版本是一个扩展方法,而这不是


我想知道为什么这个不起作用。

很容易修复,我打赌你需要将编译器从任何CPU设置为32或86。它会很好的工作。您正在使用win32库。需要将构建设置为32或86。如果这不起作用,请告诉我sow,我将重新检查代码,如果它起作用,请标记为已回答。

简单修复,我打赌您需要将编译器从任何CPU设置为32或86。它会很好的工作。您正在使用win32库。需要将构建设置为32或86。如果这不起作用,请告诉我sow,我将再次查看代码,如果它起作用,请标记为已回答。

您需要更正LVCOLUMN结构的布局,将其更改为与原始示例中相同的顺序和类型

[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]    
private struct LVCOLUMN    
{        
    public Int32 mask;        
    public Int32 cx;        
    [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
    public string pszText;
    public IntPtr hbm;
    public Int32 cchTextMax;
    public Int32 fmt;
    public Int32 iSubItem;
    public Int32 iImage;
    public Int32 iOrder;
}

您需要更正LVCOLUMN结构的布局,将其更改为与原始示例中相同的顺序和类型

[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]    
private struct LVCOLUMN    
{        
    public Int32 mask;        
    public Int32 cx;        
    [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)]
    public string pszText;
    public IntPtr hbm;
    public Int32 cchTextMax;
    public Int32 fmt;
    public Int32 iSubItem;
    public Int32 iImage;
    public Int32 iOrder;
}

Winforms?ASP.NET?WPF?Silverlight??很明显,这是Windows窗体。人们为什么看不到马上就解决不了这个问题呢?我知道这是在回避这个问题,但为什么不使用扩展方法呢?我的意思是,以一种“如果可行,就别管了”的方式…Winforms?ASP.NET?WPF?Silverlight??很明显,这是Windows窗体。人们为什么看不到马上就解决不了这个问题呢?我知道这是在回避这个问题,但为什么不使用扩展方法呢?我的意思是,以一种“如果它能工作,就别管了”的方式…它是调试x86。第一个很好用。我的根本不工作。我想你没有错误消息,程序运行时没有崩溃?这是调试x86。第一个很好用。我的根本不起作用。我猜你没有错误消息,程序运行时不会崩溃?但是在CommCtrl.h中,LVCOLUMN结构与此不同。哇,太好了,你们现在都是心灵感应读心术的见证人。但是在CommCtrl.h中,LVCOLUMN结构与此不同。哇,伟大的你们现在都是心灵感应读心术的见证人。