2010-01-07 26 views
20

Tôi có bộ lặp hiển thị dữ liệu từ bảng Dự án của mình. Có projectId, tên và mô tả. Tôi sử dụng chuỗi con (1, 240) trên mô tả. Nhưng đôi khi chuỗi ngắn hơn 240, vì vậy tôi nhận được ArgumentOutOfRangeException. Bạn có thể cho tôi biết làm thế nào để hiển thị toàn bộ văn bản nếu tôi nhận được ngoại lệ. Đây là mã của tôi.Sự cố với chuỗi con() - 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."); 
     } 
    } 

Trả lời

32
string dec = "description"; 
string result = dec.Substring(0, dec.Length > 240 ? 240 : dec.Length) 
+0

Làm cách nào để gọi? –

+0

Cảm ơn bạn. Tôi đã làm điều đó :) –

+3

Chỉ cần kiểm tra tính chính xác - 'SubString' phải là' Chuỗi con', đúng không? – brandaemon

0

Đó là một chút của một hack, nhưng phương pháp đơn giản nhất sẽ được thay đổi:

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

để

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

Tôi không chắc chắn về những cân nhắc hiệu suất về điều này, mặc dù, nếu therre là rất nhiều mặt hàng.

31

Tôi khuyên bạn nên viết một phương thức mở rộng riêng nếu bạn đang sử dụng .NET 3.5. Một cái gì đó như thế này:

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); 
} 

Về cơ bản đó là một phiên bản của Substring đó sẽ không bao giờ ném một ngoại lệ trừ khi bắt đầu hoặc chiều dài là tiêu cực (trong trường hợp này tôi không biết những gì nó một cách hợp lý có thể trở lại).

Bạn muốn gọi nó là như thế này:

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

Nhược điểm của việc này là nó sẽ bao gồm các tỉnh lược (...) ngay cả khi nó không thực sự rút ngắn chuỗi ở tất cả ...

+0

@Phil: Chăm sóc để đưa ra một ví dụ không thành công? Chỉ cần "Tôi nghi ngờ điều này không làm việc" không phải là đặc biệt hữu ích. (Tôi vừa sửa một vài vấn đề.) –

+0

Bạn không nên kiểm tra xem văn bản có rỗng hay không. Nếu không phương pháp 'an toàn' này sẽ ném! – superlogical

+1

@superlogical: Vâng, nó phụ thuộc vào cách bạn muốn nó hoạt động. Đó là "an toàn" về chỉ số. Tôi có lẽ sẽ kiểm tra xem 'văn bản' là null, nhưng chỉ để ném' ArgumentNullException' thay vì :) –

0

Nếu bạn YÊU CẦU 240 ký tự ở vị trí đó vì lý do nào đó, bạn có thể bỏ trường đó ra khỏi cơ sở dữ liệu dưới dạng char(241), trong trường hợp đó sẽ luôn là 241 ký tự, với phần đệm bên phải nếu nội dung của trường ngắn hơn hơn 241 ký tự. Sau đó, bạn vẫn có thể bỏ qua ký tự đầu tiên với số Substring(1, 240) như bạn hiện tại.

Mặc dù, tôi phải tự hỏi nếu bạn không muốn thực hiện Substring(0, 240) sẽ không ném ngoại lệ nếu chuỗi ngắn hơn 240 ký tự và bắt đầu ở đầu chuỗi chứ không phải ký tự thứ 2 .

+0

Tôi đã thử Substring (0, 240) nhưng nó vẫn còn là một ngoại lệ. –

0

Một lựa chọn khác là viết aa phương pháp mà bạn gọi để eval của bạn biến thành:

<%# GetString(Container.DataItem) %> 

Vì vậy, trong phương pháp mà bạn có thể kiểm tra để đảm bảo rằng các mục là KHÔNG null vì bạn có thể ném bom ra gọi. ToString trên một mục NULL. Sau đó, bạn có thể đánh giá mục chứa và chuyển độ dài cho cuộc gọi chuỗi con.

0
Text='<%# Eval("Description").ToString().Substring(1, Math.Min(240, Eval("Description").ToString().Length - 1)) + "..." %>' 
3

Một phương pháp mở rộng:

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); 
} 
1

Tôi sẽ viết một hàm helper hoặc mở rộng phương pháp tĩnh.

public static string SafeSubstring(string str, int start, int count){ 
    int n = str.Length; 
    return str.Substring(Math.Min(start,n), Math.Min(count,n)); 
} 

Sau đó sử dụng:

<%# SafeSubstring(Eval("Description",""), 1, 240) %> 

(Và nếu bạn cũng muốn được an toàn cho số nguyên âm, ném một số Math.Max 's với 0 trong đó.)

3

Dựa trên câu trả lời của Jon Skeet , Tôi nghĩ rằng nó nên được kiểm tra cho null hoặc người nào khác nó không phải là chính xác một phương pháp an toàn :)

public static string SafeSubstring(this string text, int start, int length) 
{ 
    if (text == null) return null;  

    return text.Length <= start ? "" 
     : text.Length - start <= length ? text.Substring(start) 
     : text.Substring(start, length); 
} 
+0

.Phương pháp thư viện net thường không kiểm tra các giá trị rỗng, chúng chỉ thổi phồng với một ngoại lệ nếu thông qua một. Đó là trách nhiệm của người gọi để kiểm tra và nên hành xử tương tự cho sự nhất quán. – samosaris

2

Y ou có thể sử dụng LINQ như dưới đây:

string someString = "abcde"; 
string subStr = string.Join("", someString.Take(240)); 
+2

Lưu ý, phương pháp này sẽ không hiệu quả hơn do chuỗi chuyển đổi chararray (tức là sao chép) sau đó Take() sau đó chuyển thành chuỗi. Chuỗi con trong nội bộ bỏ qua bước giữa. – enorl76

5
description.Substring(0, Math.Min(description.Length, 240)); 
0

Hãy cố gắng giữ này đơn giản ...

Chúng tôi chỉ cần cắt ngắn với độ dài tối đa nhất định, vậy làm thế nào về chúng tôi gọi nó là nó là gì :

description.TruncateTo(240); 

phương pháp mở rộng cho phép trên (ellipsis được nối theo mặc định nếu cắt ngắn):

public static class StringExtensions 
{ 
    public static string TruncateTo(this string val, int maxLength, bool ellipsis = true) 
    { 
     if (val == null || val.Length <= maxLength) 
     { 
      return val; 
     } 

     ellipsis = ellipsis && maxLength >= 3; 
     return ellipsis ? val.Substring(0, maxLength - 3) + "..." : val.Substring(0, maxLength); 
    } 
} 
Các vấn đề liên quan