У меня есть повторитель, который отображает данные из моей таблицы 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.");
}
}
string dec = "description";
string result = dec.Substring( 0, dec.Length > 240 ? 240 : dec.Length )
Это немного хакерство, но самый простой метод - изменить:
Eval("Description").ToString().Substring(1,240)
на
Eval("Description").ToString().PadRight(240).Substring(1, 240)
Я не уверен в том, что это связано с производительностью, хотя, если в теории много элементов.
. Если вы по каким-то причинам ЗАПРОСАИВАете 240 символов в этом месте, вы можете вывести это поле из базы данных в виде char(241)
и в этом случае всегда будет 241 символ, с подкладкой справа, если содержимое поля было короче 241 символа. Тогда вы все еще можете удалить первый символ с помощью подстроки Substring(1, 240)
, как и сейчас.
Хотя, я должен задаться вопросом, не хотите ли вы сделать Substring(0, 240)
, которая не стала бы исключением, если бы строка была короче 240 символов и начиналась бы с начала строки, а не со 2-го символа.
Предлагаю написать отдельный метод расширения, если вы используете .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) + "..."
Недостатком этого является то, что она будет включать эллипсис (...), даже если на самом деле она вообще не усечена...
.Другой вариант - это написать метод, который вы вызываете, чтобы ваша оценка превратилась в:
<%# GetString(Container.DataItem) %>
Таким образом, в этом методе вы можете проверить, что элемент НЕ является нулевым, поскольку вы можете взорвать вызов .ToString на NULL элементе. Затем вы можете оценить элемент контейнера и перейти по длине к вызову подстроки
.Text='<%# Eval("Description").ToString().Substring(1, Math.Min(240, Eval("Description").ToString().Length - 1)) + "..." %>'
Метод расширения:
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);
}