2012-06-05 41 views
9

Tôi có một chế độ xem dữ liệu với các dữ liệu sau.Siêu liên kết ô trong Winforms DataGridView

ContactType  |  Contact 
------------------------------------ 
Phone    |  894356458 
Email    |  [email protected] 

Ở đây, tôi cần hiển thị dữ liệu "[email protected]" làm siêu liên kết, với chú giải công cụ "Nhấp để gửi email". Dữ liệu số "894356458" không được có siêu liên kết.

Bất kỳ ý tưởng nào ???

TIA!

+0

Tôi đã chỉnh sửa câu trả lời của tôi, giải thích làm thế nào để sử dụng tùy chọn đầu tiên của tôi trong trường hợp của bạn tốt hơn (bằng cách ẩn một cột và sử dụng DataPropertyName) cũng như cung cấp một biến thể thứ hai trên câu trả lời nơi bạn giữ cho cột văn bản. –

Trả lời

18

DataGridView có loại cột cho điều này, DataGridViewLinkColumn.

Bạn cần DataBind cột này gõ bằng tay, nơi DataPropertyName đặt cột để ràng buộc vào trong nguồn dữ liệu của lưới:

DataGridViewLinkColumn col = new DataGridViewLinkColumn(); 
col.DataPropertyName = "Contact"; 
col.Name = "Contact";  
dataGridView1.Columns.Add(col); 

Bạn cũng sẽ muốn ẩn cột văn bản autogenerated rằng xuất phát từ Liên hệ tài sản của Cái lưới sắt.

Ngoài ra, giống như với số DataGridViewButtonColumn, bạn cần tự xử lý tương tác của người dùng bằng cách trả lời sự kiện CellContentClick.


Để thay đổi giá trị ô không phải siêu liên kết thành văn bản thuần túy, bạn cần phải thay thế loại ô liên kết bằng ô văn bản. Trong ví dụ dưới đây tôi đã làm điều này trong DataBindingComplete sự kiện:

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    foreach (DataGridViewRow r in dataGridView1.Rows) 
    { 
     if (!System.Uri.IsWellFormedUriString(r.Cells["Contact"].Value.ToString(), UriKind.Absolute)) 
     { 
      r.Cells["Contact"] = new DataGridViewTextBoxCell(); 
     } 
    } 
} 

Bạn cũng có thể làm điều này từ một hướng khác, thay đổi DataGridViewTextBoxCell đến một DataGridViewLinkCell Tôi đề nghị thứ hai này vì bạn sẽ cần phải áp dụng bất kỳ thay đổi nào áp dụng cho tất cả các liên kết đến mọi ô.

Điều này có lợi thế mặc dù bạn sẽ không cần phải ẩn cột được tạo tự động, vì vậy có thể phù hợp với bạn nhất.

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    foreach (DataGridViewRow r in dataGridView1.Rows) 
    { 
     if (System.Uri.IsWellFormedUriString(r.Cells["Contact"].Value.ToString(), UriKind.Absolute)) 
     { 
      r.Cells["Contact"] = new DataGridViewLinkCell(); 
      // Note that if I want a different link colour for example it must go here 
      DataGridViewLinkCell c = r.Cells["Contact"] as DataGridViewLinkCell; 
      c.LinkColor = Color.Green; 
     } 
    } 
} 
+0

Là một điều tốt đẹp với datagridview là khi đáp ứng với nội dung di động, bạn có thể làm một cái gì đó như mở một dịch vụ Voip khi một số điện thoại được nhấp. –

+0

Ngoài ra, bạn có thể làm ngược lại không? Xác định lưới của bạn theo mặc định (TextBoxCell) như bình thường, sau đó siêu liên kết (các) ô mà bạn muốn trong mỗi hàng? Chỉ cần tự hỏi tại sao bạn đã mặc định thành LinkCells sau đó thay đổi hoàn toàn trở lại TextBox –

+1

@Brett cột siêu liên kết có một số thuộc tính và hành vi bổ sung tiện dụng, chẳng hạn như màu liên kết đã truy cập và TrackVisitedState - chắc chắn bạn có thể thực hiện theo cách khác. cách thuận tiện hơn. –

Các vấn đề liên quan