Некоторые ячейки таблицы объединяются по тегу с помощью:
Код: Выделить всё
xrTableCell.ProcessDuplicatesMode = ProcessDuplicatesMode.Tag;
Мне также нужно управлять XRTableCell.CanGrow для каждой логической группы.
Желаемое поведение
Обычно мой Метод SetCanGrowByGroup решает, является ли группа «группой из одной строки» или группой из нескольких строк, и соответствующим образом устанавливает CanGrow.
Если группа разделена на страницы (например: 4 строки на странице 1, а последняя строка перемещается на страницу 2),
одинокая строка, которая появляется вверху страницы 2, должна рассматриваться как новая, независимая группа из одной строки для целей макета —
т.е. Для CanGrow для этой ячейки верхней строки должно быть установлено значение true, как если бы она не была объединена с предыдущей страницей.
Проблема
Когда группа строк разбита по страницам, например:
Страница
Строки одного и того же тега
1
Строка 1, Строка 2, Строка 3, Строка 4
2
Строка 5 (тот же тег, что и предыдущие строки)
Последняя строка (строка 5) на новой странице по-прежнему принадлежит той же самой логически группировать,
но для макета ее следует рассматривать как независимую группу из одной строки (поэтому ее CanGrow = true).
Однако моя текущая логика использует переменную previousGroupKey для определения границ группы,
и проблема в том, что previousGroupKey сохраняет последнее значение группы из предыдущего страница.
Это означает, что первая строка на новой странице ошибочно считает, что она все еще принадлежит той же группе.
Иллюстрация
На скриншотах ниже:
- На странице 2 последняя группа («Нгуен Чонг Нам») была отделена от предыдущей. странице.
- Эта строка отображается одна в верхней части новой страницы, но она по-прежнему имеет то же значение тега, что и строки с предыдущей страницы.
- Из-за этого CanGrow оценивается как ложный, поэтому текст адреса усечено (некоторый контент отсутствует).
Факт: Она по-прежнему рассматривается как часть предыдущей группа страницы → CanGrow = false, в результате чего адрес обрезается.
Что я ожидал
Когда группа продолжает работу на новой странице, первая строка на этой новой странице должна распознаваться как новая группа для целей макета.
Поэтому для ее свойства CanGrow должно быть установлено значение правда.
То, что у меня есть сейчас
Код: Выделить всё
public partial class DanhSachNhanQuaTang : XtraReport
{
private RptKhoPhieuNhapxuatChitietInDanhSachModel dataBaoCaoModel;
private int indexRow = 0;
private string previousGroupKey = null;
public DanhSachNhanQuaTang()
{
InitializeComponent();
}
private void DanhSachNhanQuaTang_BeforePrint(object sender, CancelEventArgs e)
{
var dataBaoCao = this.dataBaoCao.Value.ToString();
if (dataBaoCao == "") return;
dataBaoCaoModel = JsonConvert.DeserializeObject(dataBaoCao);
this.DataSource = new List { dataBaoCaoModel };
}
private void xrTableRow8_BeforePrint(object sender, CancelEventArgs e)
{
var row = sender as XRTableRow;
indexRow = row.Index;
}
private void xrTableCell_HoTen_BeforePrint(object sender, CancelEventArgs e)
{
SetCanGrowByGroup(sender as XRTableCell);
}
private void xrTableCell_DiaChi_BeforePrint(object sender, CancelEventArgs e)
{
SetCanGrowByGroup(sender as XRTableCell);
}
private void SetCanGrowByGroup(XRTableCell cell)
{
var list = dataBaoCaoModel.SoLuongPhieuChiTietNguoiNhans;
if (list == null || list.Count == 0)
{
cell.CanGrow = true;
return;
}
var currentItem = list[indexRow];
string currentGroupKey = $"{currentItem.Fullname}_{currentItem.Cccd}_{currentItem.Address}";
var nextItem = indexRow + 1 < list.Count ? list[indexRow + 1] : null;
string nextGroupKey = nextItem != null ? $"{nextItem.Fullname}_{nextItem.Cccd}_{nextItem.Address}" : null;
bool isEndOfGroup = currentGroupKey != nextGroupKey;
bool isSingleRecordGroup = currentGroupKey != previousGroupKey && isEndOfGroup;
cell.CanGrow = isSingleRecordGroup || isEndOfGroup;
previousGroupKey = currentGroupKey;
}
}
Код: Выделить всё
// I attempted to detect page changes: (not work)
private int currentPageCount = 1;
private void Detail1_BeforePrint(object sender, CancelEventArgs e)
{
var PageCount = this.PrintingSystem.PageCount;
if (PageCount != currentPageCount)
{
currentPageCount = PageCount;
previousGroupKey = null;
}
}
// and tried PageHeader_BeforePrint: (not work)
private void PageHeader_BeforePrint(object sender, CancelEventArgs e)
{
previousGroupKey = null;
}
- Тип отчета: DevExpress XtraReport (бэнд XRTable в деталях)
- Версия DevExpress: 23.2.5
Как я могу определить начало новой страницы внутри BeforePrint,
чтобы первую строку на новой странице можно было рассматривать как независимую группу (
Код: Выделить всё
CanGrow = trueДополнительное соображение
Если невозможно надежно определить, что строка напечатана на новой странице (и, следовательно, динамически настроить CanGrow), было бы целесообразно вместо этого сохранить всю объединенную группу вместе на одной странице, например используя что-то вроде KeepTogether = true для сгруппированных строк или самой таблицы, чтобы группа никогда не разбивалась на страницы?
Любой пример фрагмента или альтернативный надежный шаблон для этой проблемы с макетом группы будет очень признателен.
Подробнее здесь: https://stackoverflow.com/questions/797 ... eforeprint
Мобильная версия