2010-10-27 29 views
1

Comme le titre dit,ScrollBars de datagridview seront crash lorsque la hauteur de toutes les lignes dépassent la hauteur de la vision de datagridview

DataGridview.ScrollBars = vertical;

Supposons que la vision de DataGridview peut contenir 4 lignes, si la ligne arrive à 6, elle a un Vertical ScrollBar. Mais si vous cliquez sur ScrollBar, le programme va planter. Si nous définissons DataGridview.ScrollBars = None, aucun problème ne se produira.

public partial class visitorLeave : Form 
{ 
    public visitorLeave() 
    { 
     InitializeComponent(); 
    } 
    bool isWorkerStopped = false; 
    bool clickstart = false; 
    ManageEmployee me = null; 

    Thread tr1; 

    private void visitorLeave_Load(object sender, EventArgs e) 
    { 
     me = new ManageEmployee(10); 
     dataGridView1.AutoGenerateColumns = false; 
     dataGridView1.DataSource = me.DataSource; 
     tr1 = new Thread(new ThreadStart(Add)); 
     tr1.IsBackground = true; 
     tr1.Start(); 
    } 

    void Add() 
    { 
     while (!isWorkerStopped) 
     { 
      if (clickstart) 
      { 
       me.AddEmployee(new EmployeeData("new" + DateTime.Now.Ticks.ToString(), "0", "0", "0", "0", "0", null)); 
       dataGridView1.DataSource = me.DataSource; 
       dataGridView1.UpdateRowHeightInfo(0, true); 
       clickstart = false; 
      } 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     clickstart = !clickstart; 
    } 
} 

Répondre

1

Il est l'un des fuites dans la logique de débogage de Windows Forms qui essaie de vous détecter à l'aide de contrôles de manière fil dangereux. Il ne peut pas vous voir affecter la propriété DataSource dans un thread autre que le thread UI. Utilisez BackgroundWorker pour implémenter votre logique à threads avec

Et utilisez son gestionnaire d'événement RunworkerCompleted pour définir la propriété DataSource de la grille. Ou utilisez Control.Invoke si vous préférez conserver votre code de thread existant.

+0

Mais j'ai encore une question: je veux un programme (ou un thread) pour ajouter des données à la source de données, et le MainProgram met à jour le datagridview. Comment puis-je le faire? – Michael

+0

Il n'y a aucun problème à utiliser un thread pour ajouter des données, disons, à une liste <>. Mais la relier à la grille * doit * arriver sur le fil principal. Ce n'est pas un problème, la récupération des données est le bit cher, la liaison n'est pas. –