2010-01-22 22 views
14

Tôi đang tìm một cách để định dạng DataGridViewTextBoxColumn để giá trị được databinded được định dạng trong databinding. Ví dụ tôi có một tài sản CompanyName và tôi cần phải có 5 chữ cái đầu tiên từ CompanyName khi databinding xảy ra.Làm thế nào để dữ liệu định dạng tùy chỉnh trong datagridview trong databinding

Tôi có thể móc vào các sự kiện DataGridView khác nhau (ví dụ: RowsAdded) và lặp qua tất cả các hàng và thực hiện thủ thuật, nhưng tôi muốn tìm cách tinh vi hơn để thực hiện việc này. Kể từ khi tôi đã quyết định sử dụng databinding, looping thông qua dữ liệu và sửa đổi nó là một chút chống lại các khái niệm databinding.

Những gì tôi sau đó, là làm thế nào để làm điều tương tự như dưới đây, nhưng thêm logic tùy chỉnh định dạng:

dataGridView1.Columns[colSomeDate.Index].DataPropertyName = "SomeDate"; 
colSomeDate.DefaultCellStyle.Format = "yyyy"; 

Tôi nghĩ rằng tôi nên thực hiện IFormatProvider, nhưng tôi không hoàn toàn hiểu làm thế nào tôi nên thực hiện nó.

dataGridView1.Columns[companyName.Index].DataPropertyName = "CompanyName"; 
companyName.DefaultCellStyle.FormatProvider = new ShortText(); // ShortText should implement IFormatProvider 

Trả lời

5

Thêm thuộc tính vào lớp của bạn làm nền cho bạn và liên kết với điều đó.

+3

Vâng, vâng, nhưng nếu bạn có một vài khác nhau quan điểm với một datalayouts khác nhau sau đó bạn phải thực hiện định dạng này cho mỗi mục đích khác nhau (có nghĩa là bạn đang có một số tài sản). Tôi muốn tiếp tục định dạng từ thực thể kinh doanh thực tế. – Clack

0

Bạn luôn có thể gọi một chức năng định dạng tùy chỉnh như vậy từ trang aspx của bạn:

<asp:GridView ID="gvPlatforms" runat="server" AutoGenerateColumns="false" 
      GridLines="None"> 
<Columns> 
    <asp:TemplateField HeaderText="Icon"> 
     <ItemTemplate> 
      <asp:Image ID="imgPlatformLogo" runat="server" ImageUrl='<%#GetImagePath(Eval("Abbr")) %>' /> 
     </ItemTemplate> 
    </asp:TemplateField> 
</Columns> 

Và sau đó trong mã của bạn đằng sau cho trang đó:

protected string GetImagePath(object abbr){ 
return string.Format("{0}{1}.gif", Constants.URLs.PLATFORM_LOGOS, abbr.ToString());} 
+2

Tôi đang làm việc với Windows Forms, vì vậy giải pháp kiểu ASP.NET không hoạt động. – Clack

+1

Nó đi để cho bạn thấy rằng đối với một người đàn ông với một cái búa asp.net, mọi thứ trông giống như một trang web. –

20

I don' t biết về IFormatProvider, nhưng liệu DataGridViews CellFormatting-event có thể giúp bạn không?

private void dataGridView1_CellFormatting(object sender, 
    DataGridViewCellFormattingEventArgs e) 
{ 
    if (e.ColumnIndex == 0) 
    { 
     e.Value = e.Value.ToString().Substring(0, 5); // apply formating here 
     e.FormattingApplied = true; 
    } 
} 

http://msdn.microsoft.com/en-us/library/z1cc356h.aspx?ppud=4

+2

Ngoài ra, nếu bạn chỉ định định dạng bổ sung (ví dụ: các số đó sẽ được hiển thị là "N4") thông qua trình thiết kế, không thực hiện 'e.FormattingApplied = true' hoặc định dạng bổ sung như vậy sẽ không được áp dụng. #gotcha – Pat

1

Đây là một đoạn mã tôi sử dụng cho một ví dụ về triển khai IFormattableICustomFormatter.

Implements IFormattable 
Implements ICustomFormatter 

Public Function Format(ByVal formatExpression As String, ByVal arg As Object, ByVal formatProvider As System.IFormatProvider) As String Implements System.ICustomFormatter.Format 
    'type is currently ignored 
    ' if type is international then "USPS" should result in international address 
    ' if type is international then "US" should result in international address 
    ' and so on 
    ' 

    '.NET Framework Class Library 
    'IFormattable Interface 
    'Remarks - A class that implements IFormattable must support the "G" (general) formatting code. Besides the "G" code, the class can define the list of formatting codes that it supports. 

    'is G and g the same? 
    ' yes for numeric 
    ' no for date/time 

    'Standard Numeric Format Strings 
    ' G or g - both are the same 
    'Standard DateTime Format Strings 
    ' g - General date/time pattern (short time) 
    ' G - General date/time pattern (long time) 


    If Len(formatExpression) = 0 Then 
     Return String.Format("{0}", arg) 
    End If 

    'usps - standardized 
    'us - address less country 
    'international - all address lines 

    If formatExpression.Equals("g") Then 
     'general formatting code 
     ' as per documentation 
     Return GatherAddress(_line1, _line2, _city, _state, _zip, _country, _type, AddressFormat.StandardUS) 

    ElseIf formatExpression.Equals("G") Then 
     'general formatting code 
     ' as per documentation 
     Return GatherAddress(_line1, _line2, _city, _state, _zip, _country, _type, AddressFormat.Standardized) 

    ElseIf formatExpression.ToUpper.Equals("USPS") Then 
     Return GatherAddress(_line1, _line2, _city, _state, _zip, _country, _type, AddressFormat.Standardized) 

    ElseIf formatExpression.ToUpper.Equals("US") Then 
     Return GatherAddress(_line1, _line2, _city, _state, _zip, _country, _type, AddressFormat.StandardUS) 

    ElseIf formatExpression.ToUpper.Equals("INTERNATIONAL") Then 
     Return GatherAddress(_line1, _line2, _city, _state, _zip, _country, _type, AddressFormat.International) 

    Else 
     Return MyBase.ToString() 

    End If 

End Function 

Public Overloads Function ToString(ByVal format As String, ByVal formatProvider As System.IFormatProvider) As String Implements System.IFormattable.ToString 
    Return Me.Format(format, Nothing, formatProvider) 
End Function 
-1

Tôi thường sử dụng ValueConverters cho loại hành vi này.

cái gì đó như:

<DataGridTextColumn Binding={Binding CompanyName, Converter={StaticResource CompanyNameShortenerConverter}} /> 

Trong nút nguồn lực kiểm soát/trang, bạn sẽ cần phải thêm một cái gì đó như:

<local:CompanyNameConverter x:Key="CompanyNameShortenerConverter" /> 

CompanyNameShortenerConverter nên thực hiện IValueConverter, và bạn có thể thêm logic để "rút ngắn" tên công ty được chuyển trong phương thức "Chuyển đổi".

Điều này giúp tách logic định dạng/giao diện người dùng khỏi logic nghiệp vụ (nghĩa là không cần thêm "thuộc tính trợ giúp" để rút ngắn tên).

+2

Đề xuất tốt, nhưng câu hỏi ban đầu được gắn thẻ winforms ... –

+0

@lc. là đúng và trừ khi bạn có một ví dụ về một ValueConverter sử dụng trong WinForms, câu trả lời này là ít hơn hữu ích. – Pat

4

Có vẻ như IFormatProvider chính xác là những gì bạn cần. Sau đó, bạn có thể xác định các mã khác nhau cho các định dạng khác nhau mà bạn muốn cho các chế độ xem khác nhau.

Từ Codeproject.

public override string ToString() 
{ 
    return ToString("g", null); // Always support "g" as default format. 
} 

public string ToString(string format) 
{ 
    return ToString(format, null); 
} 

public string ToString(IFormatProvider formatProvider) 
{ 
    return ToString(null, formatProvider); 
} 

public string ToString(string format, IFormatProvider formatProvider) 
{ 
    if (format == null) format = "g"; // Set default format, which is always "g". 
    // Continue formatting by checking format specifiers and options. 
} 
5

Đây là những gì tôi đã làm để có được tôi để làm việc

public class MyFormatProvider : IFormatProvider, ICustomFormatter 
{ 
    public object GetFormat(Type formatType) 
    { 
    if (formatType == typeof(ICustomFormatter)) 
     return this; 
    else 
     return null; 
    } 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
    // Check whether this is an appropriate callback    
    if (!this.Equals(formatProvider)) 
     return null; 

    //if argument/ value is null we return empty string 
    if (arg == null) 
     return null; 

    string resultString = arg.ToString(); 

    //transform resultString any way you want (could do operations based on given format parameter) 

    //return the resultant string 
    return resultString; 
    } 
} 

Đây là những gì tôi sau đó đặt trong phòng giam định dạng xử lý của tôi

//In your datagridview, handle the cell formatting event in required cell as 
if (e.ColumnIndex == dgvPayments.Columns["amount"].Index) 
{ 
    e.Value = String.Format(new MyFormatProvider(), "{0:U}", e.Value); 
    e.FormattingApplied = true; 
} 
Các vấn đề liên quan