2016-05-27 7 views
0

Ich habe eine Liste mit einer Reihe von gezeichneten Kontrollkästchen darin.Klicken auf Drawn Checkbox

Derzeit, wenn ich auf das gezeichnete Kontrollkästchen in der Listenansicht klicke, klickt es entweder auf das erste Kontrollkästchen in dieser Spalte oder gar nicht.

Ich weiß, dass es etwas mit dem Temploint zu tun hat, also kann ich, nachdem ich dies hoffentlich veröffentlicht habe, selbst zur Lösung kommen, bevor jemand antwortet: P.

Dies ist, wo die Checkbox

gezogen wird
private void lstSourceToUser_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) 
{ 
    if (e.ColumnIndex > 1) 
    { 
     int usrIndex = userProfile.GetUserIndexByID(e.Header.Name); 
     int srcIndex = userProfile.GetUsersSourceIndex(e.Header.Name, e.Item.SubItems[0].Text); 
     Graphics g = e.Graphics; 
     CheckBoxRenderer.DrawCheckBox(g,new Point((e.Bounds.X + e.Bounds.Width/2 -10),(e.Bounds.Y)), userProfile.SystemUserList[usrIndex].fusionUserSources[srcIndex].UserSourceChkBox.MyCheckedState ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal); 
    } 
    else 
     // Draw the other subitems with default drawing. 
     e.DrawDefault = true; 
} 

Und das ist, wo das Click-Ereignis

private void lstSourceToUser_MouseClick(object sender, MouseEventArgs e) 
{ 
    ListViewItem.ListViewSubItem subItem = lstSourceToUser.HitTest(e.X, e.Y).SubItem; 
    if (subItem.Name != "") 
    { 
     Point tempPoint = new Point(e.X, e.Y); 
     int userIndex = userProfile.GetUserIndexByName(subItem.Name); 
     Rectangle rect = new Rectangle(subItem.Bounds.X, subItem.Bounds.Y, 100, subItem.Bounds.Height); 
     if (rect.Contains(tempPoint)) 
     { 
      int srcIndex = userProfile.GetUserSourceIndexByUserName(subItem.Name, lstSourceToUser.SelectedItems[0].SubItems[0].Text); 
      userProfile.SystemUserList[userIndex].fusionUserSources[srcIndex].UserSourceChkBox.MyCheckedState = !userProfile.SystemUserList[userIndex].fusionUserSources[srcIndex].UserSourceChkBox.MyCheckedState; 
      this.lstSourceToUser.Invalidate(); 
     } 
    } 
} 

passiert wäre Jede Hilfe sei es Lösungen oder Links/guides geschätzt werden :) Danke

+0

Überprüfen Sie, ob die 'subItem.Bounds.Y' die korrekte y-Position für alle Elemente meldet! – TaW

Antwort

0

Das Problem war nicht der TempPoint es war srcIndex.

if (rect.Contains(tempPoint)) 
    { 
     **int srcIndex = userProfile.GetUserSourceIndexByUserName(subItem.Name, lstSourceToUser.SelectedItems[0].SubItems[0].Text);** 
     userProfile.SystemUserList[userIndex].fusionUserSources[srcIndex].UserSourceChkBox.MyCheckedState = !userProfile.SystemUserList[userIndex].fusionUserSources[srcIndex].UserSourceChkBox.MyCheckedState; 
     this.lstSourceToUser.Invalidate(); 
    } 

public int GetUserSourceIndexByUserName(string userName, string sourceId) 
    { 
     foreach (FCMUser user in SystemUserList) 
     { 
      if (**user.id** != userName) continue; 
      var index = 0; 
      foreach (FCMSource src in user.fusionUserSources) 
      { 
       if (src.id == sourceId) 
       { 
        return index; 
       } 
       index++; 
      } 
     } 
     return 0; 
    } 

Die if-Anweisung für das Spiel Username Suche war nicht korrekt. Es wurde die Benutzer-ID und nicht der Benutzername überprüft.

Silly Fehler von mir. Lebe und lerne ich denke.

Verwandte Themen