2010-02-13 55 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