필터링 된 후 정렬 된 ListStore가 있습니다. 다음과 같이 보입니다 :Gtk에서 x 및 y 좌표로 정렬 된 TreeView에서 경로를 얻는 방법은 무엇입니까?
// Create a model for the cards
cardListStore = new ListStore (typeof (Card));
// Set up the tree view
cardFilter = new TreeModelFilter (cardListStore, null);
cardFilter.VisibleFunc = new TreeModelFilterVisibleFunc (FilterCards);
cardSort = new TreeModelSort (cardFilter);
cardTreeView.Model = cardSort;
마우스 오른쪽 버튼을 클릭 할 때 각 행에 맞는 컨텍스트 메뉴를 가져 오려고합니다. 내 클릭 핸들러는 다음과 같습니다.
[GLib.ConnectBeforeAttribute]
void HandleCardTreeViewButtonPressEvent (object o, ButtonPressEventArgs args)
{
if (args.Event.Button != 3)
return;
TreePath path;
// If right click on empty space
if (!cardTreeView.GetPathAtPos (Convert.ToInt32 (args.Event.X),
Convert.ToInt32 (args.Event.Y),
out path)) {
MakeCardEmptySpaceContextMenu().Popup();
return;
}
TreeIter iter;
if (!cardListStore.GetIter (out iter, path))
return;
Card card = (Card) cardListStore.GetValue (iter, 0);
MakeCardContextMenu (card, iter).Popup();
}
이 작업은 ListStore가 필터링되거나 정렬되지 않은 경우에 효과적입니다. 그러나 그것이 틀린 행을줍니다.
는 예를 들어, 정렬하기 전에 행은 다음과 같이 말한다 :
들이 정렬 한 후
는, 그들은 이렇게 봐
B
C :
B
A
C
두 번째 행 ("A")은 모델이 정렬되기 전에 B가 있던 곳이기 때문에 "B"를 제공합니다. 필터링 할 때도 마찬가지입니다. 이 필터링 된 후 모델은, 다음과 같습니다 말 :
두 번째 행 ("C")에
C
을 마우스 오른쪽 버튼으로 클릭은 여전히 당신에게 "B"를 줄 것이다.
이 문제를 해결하는 방법은 무엇입니까?
는'ConvertPathToChildPath' (와'ConvertChildPathToPath')이 어떤 영향을 미칠 것 같지 않습니다됩니다. 나는 또한'ConvertIterToChildIter'와'ConvertChildIterToIter'를 사용하여 엉망으로 만들려고했지만 null 참조 예외가 발생했습니다. –
사실,'cardTreeView'의'Model'은'cardListStore'가 아닌'cardSort'입니다. (첫 번째 코드 스 니펫의 마지막 줄을보십시오). 그래서'cardTreeView'가 두 번째 코드 스 니펫에서 원하는 것을 말할 수있을 것이라고 생각할 것입니다. 나 donno. 그러나 아이디어에 감사드립니다! –