2010-02-13 58 views
1

今天早些時候,我在這裏建議使用DataGridView來打印需要單獨標記的消息。WinForms DataGridView - 全文顯示和數據源更新

我遵循了這個建議,在線上閱讀後,我設法將它與我的消息列表綁定,並在調整後得到以下結果。

alt text http://img237.imageshack.us/img237/3015/datagridview.jpg

目前我有2個問題,第一個是,我沒有找到一個方法來調整行的高度,以顯示完整的消息,第二個是,當更新列表, DataGridView不顯示修改。

任何方式來解決這兩個問題?或者我需要使用DataGridView以外的東西,在這種情況下我應該使用什麼?

此外,是否有任何方式使郵件中包含的網址變得可點擊並在默認瀏覽器中打開?

編輯 有關綁定的更多信息。

基本上我有一個類的變量裏面的形式,我做了一個按鈕的初始綁定。

private void button1_Click(object sender, EventArgs e) 
{ 
    list.Add(new Class1() { Message = "http://www.google.com/", Read = false }); 
    list.Add(new Class1() { Message = "Message way too long to fit in this small column width", Read = false }); 

    dataGridView1.DataSource = list; 
} 

然後我還有一個按鈕,增加了一些項目只是爲了測試它,我知道名單是正確更新,但也有在DataGridView沒有變化。

編輯2

如果我不清楚之前我需要的寬度是固定的,並且被放大包含長文本的單元格的高度和在2條線顯示的文字

+0

BTW ,沒有像C#DataGridView那樣的東西。你的意思是.NET Windows窗體DataGridView。 C#只是編程語言。 – 2010-02-13 00:28:29

回答

0

我會刺傷,看看我能不能幫忙。

首先關閉行高。有兩個稱爲AutoResizeRow和AutoResizeRows的DataGridView方法,它們將調整行的高度以適應內容。

你能告訴我們你是如何將數據綁定到DataViewGrid和數據如何修改的?這將有助於修改不更新。

至於鏈接,不幸的是我似乎無法找到一個本身處理這類事情的對象。很可能你首先必須決定進入DataGridView的文本是否是一個鏈接(如果你是我的話,使用正則表達式)。其次,在DataGridView中以不同的方式顯示它(將其強調爲藍色)。第三,在它上面放置一個點擊事件,並通過拋出它到瀏覽器來單擊該單元格的句柄。我會稍微深入一點,因爲這看起來像很多工作(我會保持我的手指交叉,以便比別人知道的更好)。

+0

在最初的帖子中添加了更多信息,我希望現在可以更容易地得出結論。 我用不同的值測試了AutoResizeRows,比如DisplayedCells,但是沒有一個將文本分割成每個高度更多的行......我做錯了什麼? – brokencoding 2010-02-13 01:12:08

+0

不幸的是,我今晚不得不多看看這個,但我會運行一些測試,看看我是否有所幫助。抱歉,久等了! – 2010-02-13 01:15:19

+0

我不介意等待幫助,特別是當我已經因爲這個特殊問題而頭疼的時候。 – brokencoding 2010-02-13 01:25:14

1

您是否使用智能標籤檢查了EditColumn中的選項?

  • 可以添加 類型DataGridViewLinkColumn的列中,設置其Text屬性消息
  • 嘗試從寬度 和height屬性用於 塔提取任何值。通過這種方式,它將根據 的數據大小設置 列大小(單元)大小。

希望這有助於

+0

已將其更改爲DataGridViewLinkColumn,但這樣所有文本都顯示爲鏈接,而不僅僅是網址。 如果我嘗試刪除列大小,它只是返回屬性值無效。 在EditColumn選項我能做的最好的是得到一個滾動條閱讀文本的其餘部分,但這樣其他列的心不是可見witouth滾動。我似乎找不到一個固定寬度的選項,並以多行方式顯示其餘文本。 – brokencoding 2010-02-13 01:01:11

+0

檢查這篇文章,可能會幫助http://odetocode.com/Code/59.aspx – 2010-02-13 01:06:25

+0

的事情是,我不想調整列的寬度,我想成爲固定的寬度和單元格高度包含長文本被放大並顯示在兩行文本中。 不能這樣做嗎? – brokencoding 2010-02-13 01:16:09

0

對於沒有更新的列表;有兩個問題;

要注意添加/刪除,您需要列表綁定事件。最簡單的方法是確保您使用BindingList<YourClass>而不是List<YourClass>

要注意個人性質的變化(在這方面),你需要在你的類型實現INotifyPropertyChanged

public class YourClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    private string message; 
    public string Message 
    { 
     get { return message; } 
     set { message = value; OnPropertyChanged("Message"); } 
    } 
    public bool isRead; 
    [DisplayName("Read")] 
    public bool IsRead 
    { 
     get { return isRead; } 
     set { isRead = value; OnPropertyChanged("IsRead"); } 
    } 
} 

對於展示結合一個例子,以一個列表:

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     BindingList<YourClass> list = new BindingList<YourClass>(); 
     DataGridView grid = new DataGridView(); 
     grid.Dock = DockStyle.Fill; 
     grid.DataSource = list; 
     Button add = new Button(); 
     add.Text = "Add"; 
     add.Dock = DockStyle.Bottom; 
     add.Click += delegate 
     { 
      YourClass newObj = new YourClass(); 
      newObj.Message = DateTime.Now.ToShortTimeString(); 
      list.Add(newObj); 
     }; 
     Button edit = new Button(); 
     edit.Text = "Edit"; 
     edit.Dock = DockStyle.Bottom; 
     edit.Click += delegate 
     { 
      if (list.Count > 0) 
      { 
       list[0].Message = "Boo!"; 
       list[0].IsRead = !list[0].IsRead; 
      } 
     }; 
     Form form = new Form(); 
     form.Controls.Add(grid); 
     form.Controls.Add(add); 
     form.Controls.Add(edit); 
     Application.Run(form); 
    } 
+0

日Thnx了很多,這與DataViewGrid沒有更新解決了這個問題。 如果我能想出如何在每行一個多方式顯示完整的文本,而不是一個寬度滾動條,我將只是享受現在我的週末。 – brokencoding 2010-02-13 20:51:21