微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这种方法不起作用?

如何解决为什么这种方法不起作用?

| 我想在列表视图的标题显示一个排序箭头,发现了这一点: 如何使用C#在列表视图列的标题显示排序箭头? 而且有效。 我试图将代码修改为:
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,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,ref lvColumn);
    }
}
这不起作用。 原始版本是扩展方法,不是。 我想知道为什么这个不起作用。     

解决方法

        您需要更正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;
}
    ,        轻松解决,我敢打赌,您需要将编译器的Any CPU设置为32或86。它将正常工作。您正在使用win32库。需要将内部版本设置为32或86。如果这样不起作用,请告诉我,我向sow再次看一下代码,如果可以,则将其标记为已回答。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。