Камрады, спасайте от умственного истощения
Вот функциональная часть. Есть грид, надо реализовать автоматический подбор ширины столбцов в зависимости от ширины грида.
У каждого столбца есть следующие атрибуты:
Min - минимальная ширина столбца в пикселах. Если задано (т.е. не равно 0), то при любой ширине грида ширина данного столбца будет не меньше этой величины (если не умещается, появляется горизонтальный скроллинг).
Max - максимальная ширина столбца в пикселах. Если задано, то ширина этого столбца не будет превышать указанную величину (в этом случае "резерв ширины" распределяется между остальными столбцами).
Percent - ширина столбца в процентах (от общей ширины грида).
Width - ширина столбца в пикселах (рассчитывается).
Ньюансы:
Термин "ширина грида" означает ширину грида за исключением ширины вертикальной полосы прокрутки. Но если столбцы в любом случае не умещаются в грид (т.е. появляется горизонтальная полоса прокрутки), то в этом случае под шириной подразумевается ширина зоны горизонтальной прокрутки.
Если столбец имеет фиксированную ширину (т.е. Min = Max <> 0), то в этом случае его Percent равен 0 (т.к. столбец не учавствует в распределении свободного пространства).
Сумма всех значащих Percent равна 100%.
Сложности:
Самый простой способ (Width = GridWidth * Percent) не пойдет, т.к. столбцы фиксированной ширины должны исключаться из перерасчета.
Если столбец имеет минимальную ширину и рассчитываемая ширина меньше минимальной, то эту разницу надо вычесть из общей ширины грида и пересчитать ширину остальных столбцов.
Если столбец имеет максимальную ширину и рассчитываемая ширина больше максимальной, то эту разницу надо перераспределить между остальными столбцами.
Хотелось бы все сделать за один проход, но никак не выходит. Сейчас у меня трехпроходной алгоритм (в первом вычисляется сумма минимальных "ширин" столбцов, во втором предварительный рассчет ширины, в третьем перераспределение ширины столбцов, которые превышают максимальную ширину). Алгоритм работает но криво (т.е. неправильно) и тормознуто, ибо три прохода, причем третий проход итерационный.
Свой метод выкладывать не буду (чтобы не сбивать мысли общественности ), но если он поможет, то могу выложить.
Буду благодарен за предложения