2009-02-12 6 views
0

J'ai une requête à une base de données sur un thread séparé et sur le retour j'appelle un appel threadsafe. Mais une exception est créée - qu'est-ce que je fais de mal?Comment redimensionner les colonnes ListView d'une manière threadsafe - C#

note Je POPULATE aussi la vue de la liste, mais ont laissé pour plus de clarté

private void ThreadSafeListView() 
    { 


     if (this.listView1.InvokeRequired) 
     { 
      try 
      { 
       ThreadSafe Operation d = new ThreadSafeOperation(ThreadSafeListView); 
       this.Invoke(d); 
      } 
      catch { } 
     } 
     else 
     { 


      listView1.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent); 
      listView1.Columns[1].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent); 
      listView1.Columns[2].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent); 
      listView1.Columns[3].AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize); 
      listView1.Columns[4].AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize); 


     } 
    } 

Détails de l'exception = InvalidOperationException: « opération de la Croix-fil non valide: contrôle « listView1 » accessible à partir d'un fil autre que le fil sur lequel il a été créé. "

+0

Quelle est l'exception? –

+0

Quelle exception est soulevée? – VBNight

+0

Sortez le try/catch et listez l'exception que vous obtenez. – ermau

Répondre

1

Quelle exception est levée? S'il s'agit toujours d'une exception thread-safe, cela peut être dû au fait que vous n'invoquez pas l'élément qui nécessite une invocation. Essayez:

listView1.Invoke(d) 

plutôt que

this.Invoke(d) 

En théorie, cela est la forme, il devrait fonctionner, mais sans plus d'informations sur l'exception ceci est ma seule supposition.

+0

J'ai essayé que this.listView1.Invoke (d, nouvel objet [] {dt}); ...pas de chance. – Brad

0

Je donne ... Je suis juste tourner mes roues si je place ...

void listView1_Resize(object sender, EventArgs e) 
    { 
     listView1.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent); 
     listView1.Columns[1].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent); 
     listView1.Columns[2].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent); 
     listView1.Columns[3].AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize); 

    } 
0
//Here ilv is the List, who's column are to be resized 
//Get the current column widths 
ArrayList widths = new ArrayList(); 
foreach (ColumnHeader ch in ilv.Columns) 
{ 
    widths.Add(ch.Width); 
} 

//Get the total width of all the columns 
int total_width = 0; 
for (int i = 0; i < widths.Count; i++) 
{ 
    total_width += (int)widths[i]; 
} 

//Calculate percentages and resize the columns. 
for (int i = 0; i < widths.Count; i++) 
{ 
    double c_width = (int)widths[i]; 
    double pect = (c_width/total_width); 

    //get the new width, leave out 25 pixels for scrollbar 
    double n_width = (ilv.Width - 25) * pect; 
    n_width = Math.Round(n_width, 0); 

    //MessageBox.Show(c_width + " - " + pect + " - " + n_width); 
    ilv.Columns[i].Width = (int)n_width;      
} 
0

vous pouvez faire ceci:

private void listViewEx_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e) 
{ 
    e.Cancel = true; 
    e.NewWidth = 60; 
} 
0

vous pouvez effectuer les opérations suivantes code ...

d'abord obtenir la valeur de listview onload ..

puis le stocker dans une variable le faire ce code dans la propriété d'événement ColumnWidthChanging comme ça ...

 e.cancel = true; 
    e.NewWidth = // the declared variable in which you store the list view with value in the onload function of the form 

exemple est comme ce

int a = 100; 
    e.cancel =true; 
    e.e.NewWidth = a; 

comme ça

Questions connexes