PDA

צפייה בגרסה מלאה : צריך ייעוץ בסי שארפ: מחיקה node מ treeView



מוטי ג.
07-08-21, 20:04
היי,
זה בסדר להכניס קצת תוכנה לאתר? [emoji848]

אני כותב מהטלפון כרגע, אז ייתכן וחלק מהמידע לא לגמרי מדויק, אשלים /אתקן בלילה אחרי שהילדים יירדמו.
אני רוצה למיין/לפלטר תצוגה של treeView ב win form application של פעם, מצטער זה מה שאני מכיר ובדכ עם קצת גוגל גם מסתדר לצרכים קטנים פה ושם.

קיצר, יש לי tree view היררכי ב x רמות, כל אובייקט מכיל המון רמות ואובייקטים בפני עצמו,
אני רוצה לפלטר את כל מי שהוא לא מכיל טקסט מסוים ולהציגו בלבד(כמה שלא יהיו כאלה) מתוך כל הרשומה.

ניסיתי עם treeView.nodes.find אבל לא מצאתי דרך להכניס שם contain למקרה של תאימות שם חלקי עם הטקסט הנבחר למיון.

הצלחתי לעבור על כל הרשימה עם for each ולבדוק שהשם מכיל את הטקסט הנדרש, ולייצר מזה רשימה חדשה של טקסטים.
ברמת הפילטור זה עובד, אבל אני לא מצליח לגשת אח"כ ע"ב השם לכל המידע המלא שאני צריך.

תו"כ כתיבה כרגע אני חושב אולי לייצר בסוף שוב חיפוש עם for each על כל השמות שמצאתי ולהוציא עם treeView. Find את כל האובייקטים המקוריים ולייצר מהם רשימה (השלישית) שאותה אציג ליוזר.


אם עשיתי בלגן סלחו לי, אם למישהו יש רעיון לקצר את התהליך אשמח לשמוע.

אצרף קטעי קוד בלילה.....

תודה.

גיא
07-08-21, 20:42
רק אומר שיש דברים טיפה יותר מודרניים ;)…

מוטי ג.
07-08-21, 20:45
מודרני זה לחלשים [emoji6]
זה מה יש, סוס זקן אנוכי ואנרגיה ללמוד משהו חדש בשביל איזה כלי עזר קטן פעם בשנה הישן והטוב מספיק לי

נדב42
07-08-21, 21:52
אולי התגובה הראשונה לשאלה כאן תעזור לך:

https://www.vbforums.com/showthread.php?712809-Searching-a-TreeView-for-a-certain-string-and-expanding-selecting-highlighting

מוטי ג.
07-08-21, 21:57
אבדוק, תודה.

נדב42
07-08-21, 22:05
ואולי זה:

https://www.codeproject.com/Articles/1266212/Filterable-TreeView

מוטי ג.
09-08-21, 00:29
טוב, שיניתי קצת את הגישה לפתרון, עברתי רקורסיבית על כל העץ, שלפתי משם את האובייקטים שענו לקריטריון החיפוש לתוך עץ חדש זמני.ואז בסוף בניתי את העץ ליוזר ע"ב העץ הזמני.
לא מצאתי כלי להעתקה שלמה של עץ, אז עברתי עם foreach על כל האובייקטים וצירפתי אותם עם add לעץ המוצג ליוזר.
אולי זה עקום, אבל עובד עקרונית ולא מרגישים את זה ברמת היוזר, תוצאה תוך שנייה בערך.

יש לי קצת בעיות במיון עצמו, יש לי 2 וריאציות אחת עובדת נהדר על אובייקט עם היררכיה אחת , והשנייה עובדת נהדר על כל אובייקט שיש לו יותר מ2 היררכיות.השלב הבא למצוא למה אני לא מצליח לשלב בין 2 כאופציות שייתן לי מענה לכל ביחד.

אני יודע שזה משהו באופן שאני קורא לרקורסיה אבל נמאס לי מזה כרגע ולכן זה יחכה למחר בלילה (בידוד עם ילדים ואין מקום בראש לטפל בזה במשך היום)

מוטי ג.
13-08-21, 21:24
במעבר חד, מתחביב יום לתחביב לילה.
אני ממשיך כאן בשאלה אחרת אבל באותו נושא.

כל מה שתכננתי לעשות עם המיון של tree view עובד יפה.
עכשיו אני מנסה לייצר data grid view מאירוע דאבל קליק על האובייקט המוצג אחרי הפלטור.
הוספת האובייקט הראשון עובד נהדר, מלבד ה view עצמו, ה row של ה data grid מחזיק גם tag שמתסכל על האובייקט מהבסיס נתונים המקורי מקורי לפני כל המיון(הטאג מועתק מתצוגה ראשונית לתצוגה מפולטרת וגם ל data grid view החדש וזה עובד יפה).
הסבר כללי, התוכנה שולפת את כל טבלת המשתנים variables של בקר מתוכנת ברשת, זו מתודה מוכנה ממחחלקת ה rnd שלנו.
אח"כ, הפלטור הוא לפי צרכי המשתמש כרגע (ופה מתחיל מה שאני מנסה לבנות) .
עד כאן הכל עובד.

הלקוח ביקש ממני לייצר רשימה של מה שהוא בוחר ולא רק משתנה אחד אחרי פילטור,ולכן הגעתי לבניית רשומה חדשה.
המטרה בניית watch view ללא צורך בשימוש בכלי הפיתוח שלנו.
אז.... Double click event
מוסיף את האובייקט ל data grid view ע"י Add וזה עובד מעולה בשורה הראשונה בלבד.
בהוספת השורה השנייה נמחק לי ה tag שהוספתי מקודם לשורה הראשונה.. והעסק נתקע (יש טיימר מחזורי לקריאת הערך ע"ב הטאג בכל שורה, וברגע שנמחק לי הטאג של השורה הראשונה העסק נתקע, הטאג החדש בשורה השנייה נכון ועובד.)

אז השאלה.... האם העלמות הטאג ב data grid view זה משהו מוכר?
למה הטאג בשורה הראשונה נעלם לי (אני לא עורך את השורה הראשונה רק מוסיף שורה חדשה עם פרטי תצוגה רלוונטיים וtag חבוי מתאים)


מקווה שלא חפרתי מידי.

מוטי ג.
13-08-21, 22:57
פה מוזכר שהבעיה קיימת במיון:
https://social.msdn.microsoft.com/Forums/windows/en-US/3c7a7743-9673-4ff7-90e1-8299b87ed543/the-value-of-datagridviewrowtag-is-lost-after-sorting?forum=winforms

וגם מישהו מצא קומבינה, לא בדקתי עדיין אם זה עובד

מוטי ג.
14-08-21, 08:21
טוב, כמו שבכל תוכנה טובה אם לא מוצאים את מקור הבעיה, העיקר שיש WORKAROUND מספיק טוב, לא? :rolleyes:

אז זה הקוד המקורי שלי להוספת שורה ב DATA GRID VIEW :
TreeNode _symbol = treeViewSymbols.SelectedNode;


if (dataGridViewOnlineWatch.Columns.Count == 0)
{
this.dataGridViewOnlineWatch.Columns.Add ("Name", "Name");
this.dataGridViewOnlineWatch.Columns.Add ("Type", "Type");
this.dataGridViewOnlineWatch.Columns.Add ("Value", "Value");
}


DynamicSymbol DynSymbol =(DynamicSymbol)_symbol.Tag;
this.dataGridViewOnlineWatch.Rows.Add(Dy nSymbol.InstancePath, DynSymbol.TypeName, DynSymbol.ReadValue());
int CurrentAddRow = this.dataGridViewOnlineWatch.RowCount;
this.dataGridViewOnlineWatch.Rows[CurrentAddRow - 2].Tag = this.dataGridViewOnlineWatch.Rows[CurrentAddRow - 1].Tag; //Workaround :-)
this.dataGridViewOnlineWatch.Rows[CurrentAddRow-1].Tag = DynSymbol;

לפני שהוספתי את השורה המסומנת כ WORKAROUND מה שהיה קורה הוא שהשורה החדשה נוצרת עם הטקסטים הרצויים, והשורה הראשונה הייתה נשארת AS IS מבחינת הטקסטים אבל הטאג שלה היה עובר לשורה החדשה, עובר ונמחק בשורה המקורית בה הוא היה.
אז השורה שהוספתי בעצם מחזירה אותו שורה אחת למטה לפני המחיקה שלו , ואז רישום הטאג החדש לשורה החדשה תופס גם כן .
וזה עובד ל N שורות וגם קריאת הערכים מהבקר עובדת ויש לי WATCH VIEW חי ונושם :
134787

נשאר לי לטפל בכתיבת ערך חדש לבקר

-->