Реализовано на примере кадра -
df = pd.DataFrame(np.random.rand(4,12), columns=['node_1', 'node_2', 'node_3', 'node_4','node_5','node_6','node_7','node_8','node_9','node_10','node_11','B'])
+---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
| | node_1 | node_2 | node_3 | node_4 | node_5 | node_6 | node_7 | node_8 | node_9 | node_10 | node_11 | B |
+---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
| 0 | 0.626458 | 0.798481 | 0.316018 | 0.159890 | 0.507015 | 0.027955 | 0.020401 | 0.743001 | 0.914910 | 0.238461 | 0.541814 | 0.134738 |
| 1 | 0.927695 | 0.115338 | 0.378937 | 0.090682 | 0.644118 | 0.715846 | 0.049830 | 0.713174 | 0.403888 | 0.825648 | 0.376064 | 0.594877 |
| 2 | 0.592890 | 0.634705 | 0.711854 | 0.772723 | 0.451578 | 0.831289 | 0.009033 | 0.100541 | 0.114469 | 0.873390 | 0.807368 | 0.550358 |
| 3 | 0.467856 | 0.915798 | 0.889654 | 0.529412 | 0.525272 | 0.546177 | 0.724698 | 0.539031 | 0.587709 | 0.402088 | 0.464548 | 0.533932 |
+---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
cols = np.array(list(zip(*df.filter(like='node_').columns.str.split('_')))[1], dtype=int)
cols.sort()
idx = arr[-1] # new column index
df.insert(loc=int(idx), column='node_'+str(idx+1), value='')
df
+---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+---------+----------+
| | node_1 | node_2 | node_3 | node_4 | node_5 | node_6 | node_7 | node_8 | node_9 | node_10 | node_11 | node_12 | B |
+---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+---------+----------+
| 0 | 0.626458 | 0.798481 | 0.316018 | 0.159890 | 0.507015 | 0.027955 | 0.020401 | 0.743001 | 0.914910 | 0.238461 | 0.541814 | | 0.134738 |
| 1 | 0.927695 | 0.115338 | 0.378937 | 0.090682 | 0.644118 | 0.715846 | 0.049830 | 0.713174 | 0.403888 | 0.825648 | 0.376064 | | 0.594877 |
| 2 | 0.592890 | 0.634705 | 0.711854 | 0.772723 | 0.451578 | 0.831289 | 0.009033 | 0.100541 | 0.114469 | 0.873390 | 0.807368 | | 0.550358 |
| 3 | 0.467856 | 0.915798 | 0.889654 | 0.529412 | 0.525272 | 0.546177 | 0.724698 | 0.539031 | 0.587709 | 0.402088 | 0.464548 | | 0.533932 |
+---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+---------+----------+
Это не скроет повторитель полностью, но можно разделить управление Повторителем на подклассы так, чтобы это включало подобный GridView пустой шаблон данных:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
public class EmptyCapableRepeater : Repeater
{
public ITemplate EmptyDataTemplate { get; set; }
protected override void OnDataBinding ( EventArgs e )
{
base.OnDataBinding( e );
if ( this.Items.Count == 0 )
{
EmptyDataTemplate.InstantiateIn( this );
}
}
}
Вы можете их использовать его в Вашем .aspx как это:
<custom:EmptyCapableRepeater runat="server" ID="rptSearchResults">
<ItemTemplate>
<%# Eval( "Result" )%>
</ItemTemplate>
<SeparatorTemplate>
<br />
</SeparatorTemplate>
<EmptyDataTemplate>
<em>No results were found.</em>
</EmptyDataTemplate>
</custom:EmptyCapableRepeater>
Попробуйте что-то как:
<asp:Repeater runat="server" DataSource='<%#Eval("Data2")%>'
Visible='<%# ((IEnumerable)Eval("Data2")).GetEnumerator().MoveNext() %>'>
для вложенного повторителя
Когда Вы выполнили свой запрос LINQ, проверьте его свойство Count (если это - какой-то список). Если его 0, то просто поворачивают Свойство видимости ко лжи.
Насколько я знаю, что необходимо сделать это через codebehind, просто использовать событие ItemDataBound для обработки его, можно оставить в значительной степени все, как, просто введите некоторую логику, которая получает набор данных и определяет, имеет ли это записи, если не скрывают повторитель.
Я не думаю, что Вы делаете, собирается работать, я получаю ошибку, когда я пытаюсь установить DataSource, поскольку Вы пытаетесь сделать; однако, в коде позади Вас делают это:
Принятие Вас добавило слушателя ItemDataBoundEvent Вашего родительского повторителя, затем необходимо будет измениться запрос linq немного для не использования анонимного типа (Создайте защищенный класс, который имеет свойства) В mjy случае, я использую dto в качестве имени класса.
void rep1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
Repeater rep2 = (Repeater)e.Item.FindControl("rep2");
rep2.DataSource = ((dto)e.Item.DataItem).y;
rep2.DataBind();
}
Я хотел бы изучить, почему Вы думаете, что не можете решить это в коде позади.
Почему бы не использовать ListView? Он предлагает большую часть тех же функций, включая EmptyDataTemplate.
Я знаю, что это старая ветка, и приведенный выше ответ - очень хорошее решение, но у меня была похожая проблема, и я нашел другое простое решение, которым я тоже поделюсь. Это прекрасно проверяет и отображает то же самое.
Просто измените шаблон нижнего колонтитула на:
<FooterTemplate>
<li style="display:none;">This will not show.</li></ul>
</FooterTemplate>
Или, если вы используете таблицы:
<FooterTemplate>
<tr> style="display:none;"><td>But something must be in here.</td></tr></table>
</FooterTemplate>
Надеюсь, это кому-то поможет!
В событии OnItemDataBound
установите видимость на false, если ItemType
является Header
, и установите видимость на true, если ItemType
является Item
.