WinForms DataGridView - 全文显示和dataSource更新

时间:2010-02-13 00:02:09

标签: c# winforms .net-3.5

今天早些时候,我在这里建议使用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行显示文本

3 个答案:

答案 0 :(得分:1)

您是否使用智能标记检查了 EditColumn 中的选项?

  • 您可以添加类型列 DataGridViewLinkColumn,将其Text属性设置为Message
  • 尝试从宽度中删除任何值 和高度属性 柱。通过这种方式,它将设置 列大小(单元格)大小根据 数据大小。

希望这会有所帮助

答案 1 :(得分:0)

我会采取刺,看看我是否可以提供帮助。

首先关闭行高。有两个名为AutoResizeRow和AutoResizeRows的DataGridView方法,它们将调整行的高度以适应内容。

您能告诉我们您如何将数据绑定到DataViewGrid以及如何修改数据?这将有助于修改而不是更新。

至于链接,遗憾的是我似乎找不到一个本地处理这种事情的对象。很可能你首先要确定进入DataGridView的文本是否是一个链接(使用正则表达式,如果你是我)。其次,在DataGridView中以不同方式显示它(强调它,使其变为蓝色)。第三,在其上放置一个click事件,当单击该单元格时,将其抛出到浏览器中。我会进一步了解它,因为这似乎是很多工作(我会保持手指交叉,有人知道比我更好)。

答案 2 :(得分: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);
    }