2009-02-20 53 views
7

Tôi đang làm việc trên một ứng dụng ghi tên và thông tin được lưu trữ trong cơ sở dữ liệu SQLite. Tất cả các cột trong cơ sở dữ liệu là kiểu TEXT, ngoại trừ ngày sinh cột, là DATETIME. Cơ sở dữ liệu Access ban đầu mà tôi đã chuyển tới cơ sở dữ liệu SQLite cho phép null cho ngày sinh, vì vậy khi tôi sao chép nó, tôi đặt tất cả các giá trị null thành DateTime.MinValue.Thay thế DateTime.MinValue trong DataGridView

Trong ứng dụng của tôi, ngày cột sinh được định dạng như sau:

DataGridViewTextBoxColumn dateOfBirth = new DataGridViewTextBoxColumn(); 
     dateOfBirth.HeaderText = "DOB"; 
     dateOfBirth.DataPropertyName = "DateOfBirth"; 
     dateOfBirth.Width = 75; 
     dateOfBirth.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; 
     dateOfBirth.DefaultCellStyle.Format = "MM/dd/yyyy"; 

Vấn đề của tôi là hàng nơi có không phải là một ngày tháng năm sinh, cơ sở dữ liệu có DateTime.MinValue, hiển thị trong tôi DataGridView là 01/01/0001.

Tôi đang tìm cách thay thế 01/01/0001 bằng một chuỗi trống ("") trong DataGridView của mình.

private void resultsGrid_DateFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) 
    { 
     if(resultsGrid.Columns[e.ColumnIndex].Name.Equals("DateOfBirth")) 
     { 
      if ((DateTime)(resultsGrid.CurrentRow.Cells["DateOfBirth"].Value) == DateTime.MinValue) 
      { 
       // Set cell value to "" 
      } 
     } 
    } 

Bất cứ ai cũng có ý tưởng về cách thay thế DateTime.MinValue trong DataGridView bằng chuỗi rỗng? Cảm ơn!

Chỉnh sửa: Truyền giá trị ô bằng DateTime cho phép câu lệnh if tôi phải làm việc, nhưng tôi vẫn không thể tìm ra mã để thay thế MinValues ​​bằng một chuỗi trống.

+0

tương tự Q & A đã được đăng tải trên bài đăng này: http://stackoverflow.com/a/36492728/909689 –

Trả lời

5

Bạn chỉ cần bỏ nó vào DateTime

if ((DateTime)(resultsGrid.CurrentRow.Cells["DateOfBirth"].Value) == DateTime.MinValue) 
      { 
       // Set cell value to "" 
      } 
+0

tôi thêm sự thay đổi của bạn vào mã của tôi ở trên, và nó cho phép câu lệnh if của tôi hoạt động, nhưng tôi vẫn không thể tìm ra mã để thực sự thay đổi nội dung ô. –

+0

Trong câu lệnh if bạn đặt // Đặt giá trị ô thành ""; tôi đoán bạn cần phải viết mã này resultsGrid.CurrentRow.Cells ["DateOfBirth"]. Value = "" Nó nên làm điều đó –

+0

resultsGrid.CurrentRow.Cells ["DateOfBirth"]. Value = "" –

0
if (yourDateOfBirth != null) 
{ 
    Convert.ToDate(yourDateOfBirth) == DateTime.MinValue 
} 
0

bạn có thể cast đối tượng như một đối tượng DateTime:

//create a nullable intermediate variable 
System.DateTime? dtCellValue = resultsGrid.CurrentRow.Cells["DateOfBirth"].Value as System.DateTime?; 

//if this cell has been set to String.Emtpy the cast will fail 
//so ensure the intermediate variable isn't null 
if (dtCellValue.HasValue && dtCellValue == System.DateTime.MinValue) 
//set cell value appropriately 
0
private void resultsGrid_DateFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) 
{ 
    if(resultsGrid.Columns[e.ColumnIndex].Name.Equals("DateOfBirth")) 
{ 
    if ((string)resultsGrid.CurrentRow.Cells["DateOfBirth"].Value == DateTime.MinValue.ToString()) 
    { 
     // Set cell value to "" 
    } 
} 

}

Hoặc bạn có thể phải truyền tới DateTime và sau đó so sánh với Min Giá trị, nhưng có vẻ như bạn có ý tưởng đúng.

2

Mặc dù có thể khá đơn giản để đạt được chuyển đổi bạn cần (xem câu trả lời xuất sắc trước mỏ), tôi cảm thấy rằng bạn nên thay thế tất cả giá trị DateTime.MinValue trong cột cụ thể này trong cơ sở dữ liệu bằng NULL. Điều này sẽ thể hiện chính xác sự thiếu dữ liệu thực tế ở vị trí này. Hiện tại, cơ sở dữ liệu của bạn chứa dữ liệu không chính xác và bạn đang cố gắng xử lý dữ liệu để hiển thị.

Do đó, bạn có thể xử lý việc hiển thị dữ liệu trong GridView của mình bằng cách sử dụng các thuộc tính EmptyDataText hoặc NullDisplayText để cung cấp hiển thị phù hợp.

+0

Tôi là thương hiệu mới để làm việc với SQLite, vì vậy tôi có thể sai, nhưng tôi nghĩ rằng một DateTime không thể là null. Nếu nó có thể, đó sẽ là giải pháp tối ưu, bởi vì bạn đúng - tôi đã thực sự đưa dữ liệu không chính xác vào cơ sở dữ liệu của tôi. –

+0

Thật không may, tôi đã không làm việc với SQLite, và biết thậm chí ít hơn bạn có thể. Tuy nhiên, tôi nghĩ rằng nó đáng để điều tra. Hãy xem tài liệu. Trang web của họ cho tôi biết rằng trong SQLite 2, mọi thứ đều không có kiểu chữ. Đối với SQLite3 - http://www.sqlite.org/datatype3.html – Cerebrus

0

Có những câu trả lời đã đạt được những gì bạn muốn; nhưng tôi tự hỏi tại sao bạn không đặt NULL trong cơ sở dữ liệu để bắt đầu? Trong sqlite3, "datetime" ít nhiều chỉ là một chuỗi, (không có gì đặc biệt về một cột datetime kể từ khi sqlite3 chỉ là kiểu afinity, không phải kiểu binding), vì vậy bạn chỉ cần chèn NULL vào cột đó. Và trong trường hợp bạn muốn có MINVALUE của datetime khi bạn truy vấn, bạn có thể dễ dàng thực hiện một truy vấn như

select coalesce(your_datetime_column,'01/01/0001') from your_table 
4

tôi phát hiện ra lý do tại sao DateTime.MinValue được hiển thị!

dòng trong phần định dạng tế bào này gây ra MINVALUE của "01/01/0001" display:

dateOfBirth.DefaultCellStyle.Format = "MM/dd/yyyy"; 

Nếu không có dòng này, những ngày của lĩnh vực sinh trong datagridview của tôi là để trống.

Barbaros Alp vẫn chính xác về những gì tôi đang cố gắng làm vào thời điểm đó. Cảm ơn mọi người!

2

Sử dụng nullabe Định dạng ngày giờ thay vì DateTime ("DateTime?") - không sử dụng chuỗi.

dụ:

public DateTime? mydate; 

và sau đó:

DGview.Rows.Add(mydate.HasValue ? mydate : null); 
Các vấn đề liên quan