Вопрос о списке данных

У меня есть следующая привязка данных DataList внутри UpdatePanel, которая обновляется всякий раз, когда делается выбор из меню DropDown.
Однако, если ничего не извлекается из таблицы db, я получаю пустой раздел.

Что я хотел бы сделать, так это отобразить ту же таблицу, которая находится внутри ItemTemplate, вместе с текстом, например, «Администратор не найден», «Электронная почта не найдена» .... и т. Д. Для EmptyDataTempate ...
Я заметил что EmptyDataTemplate не существует для DataList, но я не хочу использовать другой элемент управления.

Есть ли способ сделать это? Пример кода приветствуется. Спасибо!

<asp:DataList ID="DataList" runat="server">
    <ItemTemplate>
        <table>
            <tr>
                <td class="style1">
                    Company Admin:
                </td>
                <td>
                    <asp:TextBox Text='<%# Eval("CompanyAdmin") %>' CssClass="input input1" ID="co_admin"
                        Width="150" runat="server" ReadOnly="True" />
                </td>
            </tr>
            <tr>
                <td>
                    Admin Email:
                </td>
                <td>
                    <asp:TextBox Text='<%# Eval("AdminEmail") %>' CssClass="input input1" ID="ad_email"
                        Width="150" runat="server" ReadOnly="True" />
                </td>
            </tr>
            <tr>
                <td>
                    Company Email:
                </td>
                <td>
                    <asp:TextBox Text='<%# Eval("CompanyEmail") %>' CssClass="input input1" ID="co_email"
                        Width="150" runat="server" ReadOnly="True" />
                </td>
            </tr>
            <tr>
                <td>
                    Telephone:
                </td>
                <td>
                    <asp:TextBox Text='<%# Eval("Telephone") %>' CssClass="input input1" ID="telephone"
                        Width="150" runat="server" ReadOnly="True" />
                </td>
            </tr>
            <tr>
                <td>
                </td>
                <td>
                </td>
            </tr>
        </table>
    </ItemTemplate>
</asp:DataList>

person Aligator3000    schedule 26.02.2011    source источник


Ответы (2)


Вы можете добавить простую функцию, которая возвращает сообщение, если поле пустое.

Вы вызываете функцию типа

<%#GetWithMsg(Container.DataItem, "CompanyEmail", "e-mail n/a")%>

Например

 <asp:TextBox Text='<%# GetWithMsg(Container.DataItem, "CompanyEmail", "e-mail n/a") %>' CssClass="input input1" ID="co_email"
                    Width="150" runat="server" ReadOnly="True" />

и код позади.

protected string GetWithMsg(object oItem, string cField, string TheMsg)
{
    var TheData = DataBinder.Eval(oItem, cField);

    if(TheData == null)
        return TheMsg;
    else
        return TheData.ToString();
}
person Aristos    schedule 26.02.2011
comment
Я попытался добавить ваш код, и по какой-то причине это не имеет значения :( Он все еще извлекает значения, но не отображает строку, когда она равна нулю. Что может быть причиной этого? Я использую панель обновления, поэтому мне нужно добавить какие-либо код в выбранном индексе изменяет раскрывающийся список, когда происходит привязка? - person Aligator3000; 26.02.2011
comment
@ user618616 может быть не нулевым, но пустым, проверьте также, если ToString().Lenght == 0 (также вы можете использовать string.IsNullOrEmpty() - person Aristos; 26.02.2011
comment
Хм... до сих пор не отображаются сообщения. - person Aligator3000; 26.02.2011
comment
приведенный выше код выглядит хорошо, возможно, вам нужно принудительно обновить эту панель UpdatePanel (в зависимости от того, как вы установили свою иерархию элементов управления). Попробуйте myYUpdatePanel.Update() . - person Lucian; 27.02.2011

не проверял, но, может быть, вы можете попробовать

'<%# !string.IsNullOrEmpty(Eval("CompanyEmail").ToString()) ? Eval("CompanyEmail") : "Email Not Found" %>'

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

'<%# !string.IsNullOrEmpty(((System.Data.DataRowView)Container.DataItem)["CompanyEmail"].ToString()) ? ((System.Data.DataRowView)Container.DataItem)["CompanyEmail"].ToString() : "Email Not Found" %>'

надеюсь, это поможет

Пример редактирования:

protected void BindData()
{
    DataTable dt = DAL.GetData(...
    if(dt.Rows.Count == 0)
    {
        dt.Rows.Add(dt.NewRow());
    }
    DataList.DataSource = dt;
    DataList.DataBind();
}
person Adam    schedule 26.02.2011
comment
По какой-то причине ничего не работает... есть ли другой способ сделать это? Заранее спасибо! - person Aligator3000; 26.02.2011
comment
извините, не заметил этого утверждения. Однако, если из таблицы db ничего не извлекается, я получаю пустой раздел, это означает, что мы не привязываем никаких данных, просто проверяем таблицу данных перед привязкой и при необходимости добавляем пустую строку, например если (dt.Rows.Count == 0) {dt.Rows.Add(dt.NewRow());} - person Adam; 27.02.2011