Предложение окна rank
позволяет вам ранжировать строки в соответствии с некоторым разделением, а затем вы можете просто выбрать верхние:
SELECT oDate, oName, oItem, oQty, oRemarks
FORM (SELECT oDate, oName, oItem, oQty, oRemarks,
RANK() OVER (PARTITION BY oName ORDER BY oDate DESC) AS rk
FROM my_table) t
WHERE rk = 1
Используйте TextRenderer. DrawText с TextFormatFlags. Флаг PathEllipsis
void label_Paint(object sender, PaintEventArgs e)
{
Label label = (Label)sender;
TextRenderer.DrawText(e.Graphics, label.Text, label.Font, label.ClientRectangle, label.ForeColor, TextFormatFlags.PathEllipsis);
}
Ваш код составляет 95% там. Единственная проблема состоит в том, что обрезанный текст оттянут сверху текста, который уже находится на маркировке.
Да благодарят, я знал об этом. Мое намерение было только для демонстрации использования DrawText
метод. Я не знал, хотите ли Вы вручную создать событие для каждой маркировки или просто переопределить OnPaint()
метод в наследованной маркировке. Спасибо за совместное использование Вашего конечного решения все же.
lubos hasko Ваш код составляет 95% там. Единственная проблема состоит в том, что обрезанный текст оттянут сверху текста, который уже находится на маркировке. Это легко решено:
Label label = (Label)sender;
using (SolidBrush b = new SolidBrush(label.BackColor))
e.Graphics.FillRectangle(b, label.ClientRectangle);
TextRenderer.DrawText(
e.Graphics,
label.Text,
label.Font,
label.ClientRectangle,
label.ForeColor,
TextFormatFlags.PathEllipsis);
То, что Вы думаете на маркировке, - то, что она поместит..., если это будет длиннее, чем ширина (не набор к автоматическому размеру), но это было бы
c:\Documents and Settings\nick\My Doc...
Если бы существует поддержка, это, вероятно, было бы на классе Пути в Системе. IO
Не трудно для записи себя, хотя:
public static string TrimPath(string path)
{
int someArbitaryNumber = 10;
string directory = Path.GetDirectoryName(path);
string fileName = Path.GetFileName(path);
if (directory.Length > someArbitaryNumber)
{
return String.Format(@"{0}...\{1}",
directory.Substring(0, someArbitaryNumber), fileName);
}
else
{
return path;
}
}
Я предполагаю, что Вы могли даже добавить его как дополнительный метод.
Вы могли использовать Систему. IO.Path. Метод GetFileName и добавляет ту строку к сокращенной Системе. IO.Path. Строка GetDirectoryName.