2010-02-13 4 views
1

Plus tôt aujourd'hui, il m'a été suggéré ici d'utiliser un DataGridView pour imprimer les messages qui nécessitaient la lecture d'une marque individuelle.WinForms DataGridView - Affichage du texte intégral et mise à jour de la source de données

J'ai suivi la suggestion, et avec un peu de lecture en ligne j'ai réussi à lier à ma liste de messages avec les résultats suivants après quelques ajustements.

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

Actuellement, j'ai 2 questions, la première est que je n'ai pas trouvé un moyen de redimensionner la hauteur de ligne pour afficher le message complet, et le second est que lorsque la liste est mise à jour, DataGridView n'affiche pas les modifications.

Un moyen de résoudre les deux problèmes? Ou dois-je utiliser autre chose que DataGridView, et dans ce cas, que dois-je utiliser?

De même, existe-t-il un moyen de cliqueter les URL contenues dans le message et de les ouvrir dans le navigateur par défaut?

EDIT Plus d'informations sur la liaison.

Fondamentalement, j'ai une variable de classe à l'intérieur du formulaire, et je fais la liaison initiale avec un bouton.

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; 
} 

Je puis un autre bouton qui ajoute quelques entrées juste pour le tester, et je sais que la liste est correctement mis à jour, mais il n'y a aucun changement dans le DataGridView.

EDIT 2

Si je n'était pas clair avant que je besoin de la largeur à fixer, et la hauteur de la cellule qui contient le texte long à agrandir et afficher le texte en 2 lignes

+0

BTW , il n'existe pas de C# DataGridView. Vous voulez dire le .NET Windows Forms DataGridView. C# est seulement le langage de programmation. –

Répondre

0

Je vais prendre un coup de couteau et voir si je peux aider.

Tout d'abord sur la hauteur de la rangée. Il existe deux méthodes DataGridView appelées AutoResizeRow et AutoResizeRows qui ajusteront la hauteur de la ligne pour qu'elle corresponde au contenu. Pouvez-vous nous montrer comment vous liez vos données à DataViewGrid et comment les données pourraient être modifiées? Cela aidera avec les modifications ne pas mettre à jour. En ce qui concerne le lien, malheureusement, je n'arrive pas à trouver un objet qui gère nativement ce genre de chose. Très probablement vous devrez d'abord décider si le texte entrant dans DataGridView est un lien (en utilisant une expression régulière, si vous étiez moi). Ensuite, affichez-le différemment dans DataGridView (soulignons-le, rendez-le bleu). Troisièmement, mettez un événement click sur celui-ci et lorsque vous cliquez sur cette cellule, gérez-le en le jetant dans un navigateur. Je vais regarder un peu plus loin, car cela semble être beaucoup de travail (et je croiserai les doigts que quelqu'un sait mieux que moi).

+0

Ajouté plus d'informations à la publication initiale, j'espère que c'est plus facile de tirer des conclusions maintenant. J'ai testé les AutoResizeRows avec différentes valeurs, comme DisplayedCells, mais aucun d'entre eux n'a divisé le texte en plusieurs lignes par hauteur ... qu'est-ce que je fais de mal? – brokencoding

+0

Malheureusement je vais devoir regarder ça un peu plus ce soir mais je vais faire quelques tests et voir si je suis d'aide. Désolé pour l'attente! –

+0

Ça ne me dérange pas d'attendre de l'aide, surtout quand je suis déjà avec un mal de tête à cause de ce problème particulier. – brokencoding

1

avez-vous vérifié les options dans le EditColumn en utilisant la balise intelligente?

  • vous pouvez ajouter colonne de type DataGridViewLinkColumn, définissez la propriété Text message
  • Essayez de supprimer toute valeur de largeur et les propriétés de hauteur pour une colonne . Ainsi, la taille de la colonne (cellule) sera définie en fonction de la taille des données, en fonction de .

espérons que cette aide

+0

L'a remplacé par DataGridViewLinkColumn, mais de cette façon tout le texte apparaît sous la forme d'un lien, pas seulement les URL. Si j'essaie de supprimer les tailles de colonne, il retourne simplement que la valeur de la propriété n'est pas valide. Dans les options EditColumn, le mieux que je pouvais faire était d'obtenir une barre de défilement pour lire le reste du texte, mais de cette façon l'autre colonne n'est pas visible avec le défilement. Je ne peux pas sembler trouver une option pour garder une largeur fixe et montrer le reste du texte d'une manière multiligne. – brokencoding

+0

vérifier cet article, pourrait aider http://odetocode.com/Code/59.aspx –

+0

La chose est que je ne veux pas redimensionner la largeur de la colonne, je veux que la largeur soit fixée, et la hauteur de la cellule qui contient le texte long à agrandir et afficher le texte en 2 lignes. Est-ce que cela peut être fait? – brokencoding

0

En ce qui concerne la liste mise à jour de ne pas; il y a deux problèmes; Pour remarquer l'ajout/le retrait, vous avez besoin d'événements de liaison de liste. Le moyen le plus simple de le faire est de vous assurer d'utiliser un BindingList<YourClass> plutôt qu'un List<YourClass>.

à remarquer des changements aux propriétés individuelles (dans ce contexte), vous aurez besoin de mettre en œuvre INotifyPropertyChanged votre type:

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"); } 
    } 
} 

Pour un exemple montrant que la liaison à une liste:

[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 alot, qui a résolu le problème avec le DataViewGrid ne pas mettre à jour. Si je pouvais juste comprendre comment afficher le texte intégral d'une manière multiligne par ligne, au lieu d'une barre de défilement de largeur je serais en train de profiter de mon week-end à peu près maintenant. – brokencoding

Questions connexes