Я использую неавтоматический элемент управления VScrollBar для панели FlowLayoutPanel, содержащей элементы управления UserControl.
Мне нужно выяснить, расположены ли какие-либо элементы управления в моей FlowLayoutPanel за пределами клиентской области. Я хочу использовать эту информацию, чтобы определить, виден ли VScrollBar или нет. Я поместил следующий код в метод обработчика событий FlowLayoutPanel Layout:
bool lookingForControl = true;
bool controlBelowClientArea = false;
int controlIndex = 0;
int controlBottomPos;
Control[] controlsTemp = new Control[leftFlowLayoutPanel.Controls.Count];
leftFlowLayoutPanel.Controls.CopyTo(controlsTemp, 0);
while (lookingForControl) {
controlBottomPos = controlsTemp[controlIndex].Bottom +
controlsTemp[controlIndex].Margin.Bottom;
debugTextBox.AppendText("Bottom position of control " + controlIndex +
": " + controlBottomPos + "\n");
if (controlBottomPos > leftFlowLayoutPanel.ClientSize.Height) {
controlBelowClientArea = true;
lookingForControl = false;
}
controlIndex ++;
if (controlIndex == leftFlowLayoutPanel.Controls.Count) {
lookingForControl = false;
}
}
Вот выходные данные для debugTextBox, полученные в результате добавления четырех последовательных элементов управления к элементу управления 2, для которого свойство AutoSize имеет значение true. Элемент управления 2 содержится в leftFlowLayoutPanel, и элементы управления добавляются к нему нажатием кнопки, содержащейся в нем:
- Форма только что загружена:
- Нижнее положение регулятора 0:3
- Нижнее положение регулятора 1:128
- Нижнее положение регулятора 2: 253
- Добавлен первый элемент управления:
- Нижнее положение регулятора 0:3
- Нижнее положение регулятора 1:128
- Нижнее положение регулятора 2: 253
- Добавлен второй элемент управления:
- Нижнее положение регулятора 0:3
- Нижнее положение регулятора 1: 226
- Нижнее положение регулятора 2: 351
- Добавлен третий элемент управления:
- Нижнее положение регулятора 0:3
- Нижнее положение регулятора 1: 324
- Нижнее положение регулятора 2: 449
- Добавлен четвертый элемент управления:
- Нижнее положение регулятора 0:3
- Нижнее положение регулятора 1: 422
- Нижнее положение регулятора 2: 547
После добавления четвертого элемента управления одно из нижних краев элемента управления превышает высоту ClientArea своего контейнера (458), и элементу управленияBelowClientArea присваивается значение true.
Проблема ясна: значения, которые я получаю из FlowLayoutPanel во время события макета, на один шаг отстают от результирующего макета формы. После того, как я добавил четвертый элемент управления к элементу управления 1, его нижнее положение должно быть 520.
Единственный ответ, который пришел мне в голову, заключается в том, что событие Layout происходит до того, как все значения свойств будут правильно установлены. Возможно, он вызывается перед выполнением какой-либо встроенной логики компоновки. Если это так, есть ли более подходящее событие, которое я мог бы обработать?