【问题标题】:WinForms DataGridView - Full text display and dataSource updateWinForms DataGridView - 全文显示和数据源更新
【发布时间】:2010-02-13 00:02:08
【问题描述】:

今天早些时候,有人建议我在这里使用 DataGridView 来打印需要单独标记为已读的消息。

我听从了这个建议,通过一些在线阅读,我设法将它绑定到我的消息列表,经过一些调整,结果如下。

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

目前我有两个问题,第一个是我没有找到调整行高以显示完整消息的方法,第二个是更新列表时,DataGridView 不显示修改。

有什么办法可以解决这两个问题?还是我需要使用 DataGridView 以外的东西,在这种情况下我应该使用什么?

另外,有什么方法可以让消息中包含的 url 变成可点击并在默认浏览器中打开?

编辑 有关绑定的更多信息。

基本上我在表单中有一个类变量,我用一个按钮进行初始绑定。

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 行显示文本

【问题讨论】:

  • 顺便说一句,没有 C# DataGridView 这样的东西。您的意思是 .NET Windows 窗体 DataGridView。 C# 只是编程语言。

标签: c# winforms .net-3.5


【解决方案1】:

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

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

希望对你有帮助

【讨论】:

  • 将其更改为 DataGridViewLinkColumn,但这样所有文本都显示为链接,而不仅仅是 url。如果我尝试删除列大小,它只会返回属性值无效。在 EditColumn 选项中,我能做的最好的事情是获得一个滚动条来阅读其余的文本,但这样一来,另一列在没有滚动的情况下是不可见的。我似乎找不到保持固定宽度并以多行方式显示其余文本的选项。
  • 问题是我不想调整列的宽度,我希望宽度是固定的,并且包含长文本的单元格高度被放大并以 2 行显示文本.不能这样做吗?
【解决方案2】:

我会试一试,看看能不能帮上忙。

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

您能否向我们展示您如何将数据绑定到 DataViewGrid 以及如何修改数据?这将有助于修改不更新。

至于链接,不幸的是,我似乎无法找到一个可以原生处理此类事情的对象。很可能您首先必须确定进入 DataGridView 的文本是否是链接(如果您是我,请使用正则表达式)。其次,在 DataGridView 中以不同方式显示(下划线,使其变为蓝色)。第三,在其上放置一个单击事件,当单击该单元格时,通过将其扔给浏览器来处理该事件。不过,我会更深入地研究它,因为这似乎需要做很多工作(我会祈祷有人比我更了解)。

【讨论】:

  • 在最初的帖子中添加了更多信息,我希望现在更容易得出结论。我用不同的值测试了 AutoResizeRows,比如 DisplayedCells,但它们都没有将文本分成每个高度的更多行......我做错了什么?
  • 不幸的是,今晚我将不得不多看一下这个,但我会进行一些测试,看看是否有帮助。抱歉让您久等了!
  • 我不介意等待帮助,尤其是当我已经因为这个特殊问题而头疼的时候。
【解决方案3】:

关于列表不更新;有两个问题;

要注意添加/删除,您需要列表绑定事件。最简单的方法是确保您使用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);
    }

【讨论】:

  • Thnx 很多,这解决了 DataViewGrid 不更新的问题。如果我能弄清楚如何以每行多行的方式显示全文,而不是宽度滚动条,我现在就会享受我的周末了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2011-01-02
  • 2012-09-08
  • 2023-03-20
  • 2013-08-30
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多