Używam widoku drzewa z trzema poziomami węzłów, drugiego poziomu, który ustawiłem, aby nie mieć pól wyboru przy użyciu kodu w this question.TreeNode.Handle nie powraca przy użyciu Treeview
To działa bardzo dobrze z wyjątkiem pierwszego wyboru nigdy nie napotka ma wyboru usunięte:
Dzwonię metodę HideCheckBox() z tym kodem, który jest po wszystkich danych ma zostały załadowane do katalogów:
foreach (TreeNode appNode in trvPermissions.Nodes)
{
foreach (TreeNode secNode in appNode.Nodes)
{
HideCheckBox(trvPermissions, secNode);
}
}
kiedy krok poprzez kod wydaje się, że node.Handle zwraca 0 dla pierwszego węzła napotka i nie jest to ważne, aby korzystać z uchwytu podczas wywoływania kodu w celu usunięcia czek pudełko. Co dziwne, jeśli zadzwonię do metody, aby usunąć zaznaczenie dwa razy, uchwyt zostanie zwrócony prawidłowo.
Czy ktoś może zasugerować, dlaczego TreeNode.Handle nie zwróci poprawnej wartości?
EDIT:
Oto kod na żądanie -
private const int TVIF_STATE = 0x8;
private const int TVIS_STATEIMAGEMASK = 0xF000;
private const int TV_FIRST = 0x1100;
private const int TVM_SETITEM = TV_FIRST + 63;
[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)]
private struct TVITEM
{
public int mask;
public IntPtr hItem;
public int state;
public int stateMask;
[MarshalAs(UnmanagedType.LPTStr)]
public string lpszText;
public int cchTextMax;
public int iImage;
public int iSelectedImage;
public int cChildren;
public IntPtr lParam;
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam,
ref TVITEM lParam);
/// <summary>
/// Hides the checkbox for the specified node on a TreeView control.
/// </summary>
private void HideCheckBox(TreeView tvw, TreeNode node)
{
TVITEM tvi = new TVITEM();
tvi.hItem = node.Handle;
tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_STATEIMAGEMASK;
tvi.state = 0;
SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi);
}
możesz pokazać swój kod tam, gdzie to pole wyboru jest usuwane i dzwonić do węzła.Handle? –
Czy TreeView jest widoczny po wywołaniu HideCheckBox()? Mam na myśli, że TreeView.Visible jest ustawione na true? –