Проблема с подстрокой () - ArgumentOutOfRangeException

У меня есть повторитель, который отображает данные из моей таблицы Projects. Там спроектированы, имя и описание. Я использую Подстроку (1, 240) на описании. Но иногда строка короче, чем 240, таким образом, я получаю ArgumentOutOfRangeException. Можно ли сказать мне, как отобразить целый текст, если я получаю исключение. Это - мой код.

    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<asp:Panel ID="pnlDisplayProjects" runat="server" Visible="true">
    <center><h2><b>Проекти</b></h2></center>
        <asp:Repeater ID="rptrProjects" runat="server">
            <HeaderTemplate>
                <table border="1" cellpadding="2" cellspacing="2" align="center" width="80%" style="background-color:#F7F6F3;">
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td align="left" style="width:40px">
                        <asp:Label ID="LblProjectId" runat="server" Text='<%# Eval("ProjectID") %>' />
                    </td>
                    <td align="center">
                        <asp:Label ID="LblName" runat="server" Text='<%# Eval("Name") %>' />
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        <asp:Label ID="LblDescription" runat="server" Text='<%# Eval("Description").ToString().Substring(1, 240) + "..." %>'/>
                        <asp:HyperLink ID="HlMore" runat="server" NavigateUrl='<%#"~/Project/ViewProject.aspx?projectId=" + Eval("ProjectID") %>' Text="More" />
                    </td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table>
            </FooterTemplate>
        </asp:Repeater>
</asp:Panel>

 protected override void OnPreRender(EventArgs e)
    {
        var table = Projects.GetTableWithProjects();

        if (table.Rows.Count > 0)
        {
            rptrProjects.DataSource = table;
            rptrProjects.DataBind();
        }
        else
        {
            pnlDisplayProjects.Visible = false;
            Master.PrintMessage("There are no projects.");
        }
    }
24
задан Ivan Stoyanov 7 January 2010 в 15:43
поделиться

7 ответов

string dec = "description";
string result = dec.Substring( 0, dec.Length > 240 ? 240 : dec.Length )
38
ответ дан 28 November 2019 в 22:11
поделиться

Это немного хакерство, но самый простой метод - изменить:

Eval("Description").ToString().Substring(1,240)

на

Eval("Description").ToString().PadRight(240).Substring(1, 240)

Я не уверен в том, что это связано с производительностью, хотя, если в теории много элементов.

.
1
ответ дан 28 November 2019 в 22:11
поделиться

Если вы по каким-то причинам ЗАПРОСАИВАете 240 символов в этом месте, вы можете вывести это поле из базы данных в виде char(241) и в этом случае всегда будет 241 символ, с подкладкой справа, если содержимое поля было короче 241 символа. Тогда вы все еще можете удалить первый символ с помощью подстроки Substring(1, 240), как и сейчас.

Хотя, я должен задаться вопросом, не хотите ли вы сделать Substring(0, 240), которая не стала бы исключением, если бы строка была короче 240 символов и начиналась бы с начала строки, а не со 2-го символа.

.
0
ответ дан 28 November 2019 в 22:11
поделиться

Предлагаю написать отдельный метод расширения, если вы используете .NET 3.5. Что-то вроде этого:

public static string SafeSubstring(this string text, int start, int length)
{
    return text.Length <= start ? ""
        : text.Length - start <= length ? text.Substring(start)
        : text.Substring(start, length);
}

В основном это версия Substring, которая никогда не будет бросать исключение, если только начало или длина не будет отрицательной (в этом случае я не знаю, что она может разумно вернуть).

Вы бы назвали это так:

Eval("Description").ToString().SafeSubstring(1, 240) + "..."

Недостатком этого является то, что она будет включать эллипсис (...), даже если на самом деле она вообще не усечена...

.
37
ответ дан 28 November 2019 в 22:11
поделиться

Другой вариант - это написать метод, который вы вызываете, чтобы ваша оценка превратилась в:

<%# GetString(Container.DataItem) %>

Таким образом, в этом методе вы можете проверить, что элемент НЕ является нулевым, поскольку вы можете взорвать вызов .ToString на NULL элементе. Затем вы можете оценить элемент контейнера и перейти по длине к вызову подстроки

.
0
ответ дан 28 November 2019 в 22:11
поделиться
Text='<%# Eval("Description").ToString().Substring(1, Math.Min(240, Eval("Description").ToString().Length - 1)) + "..." %>'
0
ответ дан 28 November 2019 в 22:11
поделиться

Метод расширения:

public static string SafeSubstring(this string text, int start, int length)
{
   if (start >= text.Length)
      return "";            
   if (start + length > text.Length)
      length = text.Length - start;         
   return text.Substring(start, length);
}
3
ответ дан 28 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

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