Почему этот метод не работает? - PullRequest
0 голосов
/ 14 июня 2011

Я хочу отобразить стрелку сортировки в заголовке представления списка, и я нашел это:

Как отобразить стрелку сортировки в заголовке столбца представления списка с помощью 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, 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);
    }
}

Это не работает.

оригинальная версия - это метод расширения, а это не так.

Я хочу знать, почему этот метод не работает.

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

Вам нужно исправить макет структуры 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;
}
1 голос
/ 14 июня 2011

Легко исправить, я уверен, вам нужно установить компилятор с любого процессора на 32 или 86. И он будет работать просто отлично.Вы используете библиотеки Win32.Нужно установить сборку на 32 или 86. Если это не сработает, скажите, что я пойду, я еще раз посмотрю на код, если он работает, пометьте как отвеченный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...