Измените объект, переданный функции с Chart
на полный ChartObject
, например:
Private Sub HideEmptyCharts()
Dim wksCharts As Worksheet
Dim objCO As ChartObject
Set wksCharts= ThisWorkbook.Sheets("Report output")
For Each objCO In wksCharts.ChartObjects
objCO.Visible = True
If IsChartEmpty(objCO) Then objCO.Visible = False
Next objCO
End Sub
Private Function IsChartEmpty(co As ChartObject) As Boolean
Dim i As Integer
Dim j As Integer
Dim objSeries As Series
For i = 1 To co.Chart.SeriesCollection.Count
Set objSeries = co.Chart.SeriesCollection(i)
For j = 1 To UBound(objSeries.Values)
If objSeries.Values(j) <> 0 Then
IsChartEmpty = False
Exit Function
End If
Next j
Next i
IsChartEmpty = True
End Function
Это сводится к перечислению всех средств управления в иерархии управления:
IEnumerable<Control> EnumerateControlsRecursive(Control parent)
{
foreach (Control child in parent.Controls)
{
yield return child;
foreach (Control descendant in EnumerateControlsRecursive(child))
yield return descendant;
}
}
Можно использовать его как это:
foreach (Control c in EnumerateControlsRecursive(Page))
{
if(c is TextBox)
{
// do something useful
}
}
Depeding, на которой библиотеке UI или языке Вы используете, контейнерные средства управления, такие как панели, ведут список дочерних элементов управления. Чтобы протестировать, если форма/страница имеет какие-либо данные, необходимо рекурсивно искать каждую панель средства управления вводом данных, такие как текстовые поля. Затем протестируйте, если какие-либо из средств управления вводом данных содержат значения кроме значения по умолчанию.
Простые решения состояли бы в том, чтобы реализовать класс наблюдателя, который присоединяет к измененным событиям Ваших средств управления данными. Если наблюдатель инициирован затем, Ваша страница имеет изменения. Необходимо будет учесть действия, такие как изменение и затем возвращающиеся данные.
Можно циклично выполниться посредством средств управления панелями
foreach (Control c in MyPanel.Controls)
{
if (c is Textbox) {
// do something with textbox
} else if (c is Checkbox) {
/// do something with checkbox
}
}
Если Вам вложат их внутри, то Вам будет нужна функция, которая делает это рекурсивно.
Решение очень похоже на решение Cristian, которое использует рекурсию и обобщения для поиска любого элемента управления на странице (вы можете указать элемент управления, с которого следует начать поиск).