Как я могу скрыть повторитель в ASP.NET C#, если DataSource не содержит объектов?

Реализовано на примере кадра -

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 |
+---+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+---------+----------+
7
задан James Skemp 29 November 2008 в 04:33
поделиться

8 ответов

Это не скроет повторитель полностью, но можно разделить управление Повторителем на подклассы так, чтобы это включало подобный 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>
10
ответ дан 6 December 2019 в 11:53
поделиться

Попробуйте что-то как:

<asp:Repeater runat="server" DataSource='<%#Eval("Data2")%>' 
    Visible='<%# ((IEnumerable)Eval("Data2")).GetEnumerator().MoveNext() %>'>

для вложенного повторителя

4
ответ дан 6 December 2019 в 11:53
поделиться

Когда Вы выполнили свой запрос LINQ, проверьте его свойство Count (если это - какой-то список). Если его 0, то просто поворачивают Свойство видимости ко лжи.

0
ответ дан 6 December 2019 в 11:53
поделиться

Насколько я знаю, что необходимо сделать это через codebehind, просто использовать событие ItemDataBound для обработки его, можно оставить в значительной степени все, как, просто введите некоторую логику, которая получает набор данных и определяет, имеет ли это записи, если не скрывают повторитель.

0
ответ дан 6 December 2019 в 11:53
поделиться

Я не думаю, что Вы делаете, собирается работать, я получаю ошибку, когда я пытаюсь установить 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();
}

Я хотел бы изучить, почему Вы думаете, что не можете решить это в коде позади.

0
ответ дан 6 December 2019 в 11:53
поделиться

Почему бы не использовать ListView? Он предлагает большую часть тех же функций, включая EmptyDataTemplate.

2
ответ дан 6 December 2019 в 11:53
поделиться

Я знаю, что это старая ветка, и приведенный выше ответ - очень хорошее решение, но у меня была похожая проблема, и я нашел другое простое решение, которым я тоже поделюсь. Это прекрасно проверяет и отображает то же самое.

Просто измените шаблон нижнего колонтитула на:

<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> 

Надеюсь, это кому-то поможет!

0
ответ дан 6 December 2019 в 11:53
поделиться

В событии OnItemDataBound установите видимость на false, если ItemType является Header, и установите видимость на true, если ItemType является Item.

0
ответ дан 6 December 2019 в 11:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: