Уважаемые, кто сталкивался с подоюной проблемой на C# — отзовитесь:
Есть список, элементы которого я сам отрисовываю. При добавлении всего 1 элемента в список необходимо чтобы он прорисовывался в нижней части списка. Отрисовку то впринцие я выполняю внизу, но элемент должен быть полно функциональным, т.е тупо нарисовав его внизу и щелнув на нем мышой он не фокусируется т.к. сам итем помещается вверх. Каким-то образом нужно посылать сообщение с координатами этого итема, но каким образом?
Здравствуйте, Noxerist, Вы писали:
N>Каким-то образом нужно посылать сообщение с координатами этого итема, но каким образом?
может проще добавлять элемент в конец списка?
Здравствуйте, SiAVoL, Вы писали: SAV>может проще добавлять элемент в конец списка?
Проблему как раз и решаю подобным образом, только при добавлении сортрую элементы должным образом, чтобы необходимый элемент и был на нужном месте. Если число элементов списка > числа отображаемых элементов списка (в моем случае 23 элемента), то проблем невозникает, а если число меньше (в моем случае 23) то как раз и нужно перенести их сверху вниз. Кнечно есть вариант добавление при инициализации итемов с текстом ( много пробелов больщое значение для правильной сортировки), но это несколько некрасиво, хотелось бы решить проблему по изящнее, стараюсь не для себя.
Здравствуйте, Noxerist, Вы писали:
N>Здравствуйте, SiAVoL, Вы писали: SAV>>может проще добавлять элемент в конец списка?
N>Проблему как раз и решаю подобным образом, только при добавлении сортрую элементы должным образом, чтобы необходимый элемент и был на нужном месте. Если число элементов списка > числа отображаемых элементов списка (в моем случае 23 элемента), то проблем невозникает, а если число меньше (в моем случае 23) то как раз и нужно перенести их сверху вниз. Кнечно есть вариант добавление при инициализации итемов с текстом ( много пробелов больщое значение для правильной сортировки), но это несколько некрасиво, хотелось бы решить проблему по изящнее, стараюсь не для себя.
Приходит в голову такой себе нетривиальный вариант решения. Вы пишете Враппер для своих элементов списка. То есть в список добавляете враппер. Если он находится на "обычном" месте, он отображается и выполняет функции обычного элемента и работает с дочерним "обычным" объектом, если же он находится в конце списка или в конце видимого списка, пусть он работает с вашим "конечным" элементом и отображается должным образом. Надеюсь идея понятна. Таким образом сам список менять не нужно будет. Сортровка будет работать правильно, так как есть возможность перегрузить ToString(). Возможно, в этой идее есть ошибки, думал сходу.
Здравствуйте, Pavel M., Вы писали:
PM>Приходит в голову такой себе нетривиальный вариант решения. Вы пишете Враппер для своих элементов списка. То есть в список добавляете враппер. Если он находится на "обычном" месте, он отображается и выполняет функции обычного элемента и работает с дочерним "обычным" объектом, если же он находится в конце списка или в конце видимого списка, пусть он работает с вашим "конечным" элементом и отображается должным образом. Надеюсь идея понятна. Таким образом сам список менять не нужно будет. Сортровка будет работать правильно, так как есть возможность перегрузить ToString(). Возможно, в этой идее есть ошибки, думал сходу.
Я наверное тоже не совсем, понял Вас, но помоему — враппер это обертка для моих данных, и каким бы хитрым он небыл, если число элементов списка = 1, а число отображаемых элементов 20 , то как не крути, но этот 1 элемент нужно отобразить внизу списка. Как я только не пытался — и свойство Items[i].Position менял, и гдето нашел (код ниже) всеравно элемент на месте поумолчанию. Такое ощущение что нужно писать контрол с нуля — который, как мне кажется, небудет достаточно быстрым, а требования по скорости полностью неудоволетворяет и стандартный контрол)
[System.Runtime.InteropServices.StructLayout(System .Runtime.InteropServices.LayoutKind.Sequential, Pack=2)]
public struct MAKELPARAM
{
public ushort wLow;
public ushort wHigh;
}
[System.Runtime.InteropServices.DllImport("User32.dll")]
public extern static int SendMessage(IntPtr hwnd, int message, int wparam, MAKELPARAM lparam);
private void SetItemPosition(int i, int x, int y)
{
MAKELPARAM M = new MAKELPARAM();
M.wHigh = (ushort)x; //New x-position of the item's upper-left corner, in view coordinates.
M.wLow = (ushort)y; //New y-position of the item's upper-left corner, in view coordinates. ;
SendMessage(this.Handle, 0x1000 + 15, i, M);
}