WinForms DataGridView - полнотекстовое отображение и обновление источника данных - PullRequest
1 голос
/ 13 февраля 2010

Ранее сегодня мне было предложено использовать DataGridView для печати сообщений, для которых требовалась отдельная отметка как прочитанная.

Я последовал этому предложению, и после некоторого чтения в Интернете мне удалось привязать его к моему списку сообщений со следующими результатами после некоторой настройки.

альтернативный текст http://img237.imageshack.us/img237/3015/datagridview.jpg

В настоящее время у меня есть 2 проблемы, во-первых, я не нашел способа изменить размер строки, чтобы отобразить полное сообщение, а во-вторых, когда обновляется список, DataGridView не отображается модификации.

Есть ли способ решить обе проблемы? Или мне нужно использовать что-то другое, чем DataGridView, и в этом случае, что я должен использовать?

Кроме того, есть ли способ, чтобы URL-адреса, содержащиеся в сообщении, стали активными и открываться в браузере по умолчанию?

EDIT Больше информации относительно привязки.

По сути, у меня есть переменная класса внутри формы, и я делаю начальную привязку с помощью кнопки.

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 ]

1 голос
/ 13 февраля 2010

Вы проверили опции в EditColumn , используя смарт-тег?

  • Вы можете добавить столбец типа DataGridViewLinkColumn, установите его свойство Text равным Message
  • Попробуйте удалить любое значение из ширины и свойства высоты для колонка. Таким образом, он установит размер столбца (ячейка) в соответствии с размер данных.

надеюсь, это поможет

0 голосов
/ 13 февраля 2010

По поводу списка не обновляется; есть две проблемы;

Чтобы заметить добавление / удаление, вам нужны события привязки списка. Самый простой способ сделать это - убедиться, что вы используете 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 голосов
/ 13 февраля 2010

Я сделаю удар и посмотрю, смогу ли я помочь.

Сначала с высоты строки.Существует два метода DataGridView, которые называются AutoResizeRow и AutoResizeRows, которые регулируют высоту строки в соответствии с содержимым.

Можете ли вы показать нам, как вы связываете свои данные с DataViewGrid и как эти данные могут быть изменены?Это поможет с модификациями, которые не обновляются.

Что касается ссылки, к сожалению, я не могу найти объект, который обрабатывает подобные вещи изначально.Скорее всего, вам сначала нужно будет решить, является ли текст, входящий в DataGridView, ссылкой (используя регулярное выражение, если вы были мной).Во-вторых, отобразите его по-другому в DataGridView (подчеркните его, сделайте его синим).В-третьих, поместите событие click в него, и когда эта ячейка будет нажата, обработайте ее, выбросив в браузер.Однако я немного углублюсь в это, так как это кажется большой работой (и я буду держать пальцы скрещенными, чтобы кто-то знал лучше меня).

...