-
שלום וברכה.
יש לי בויזואל סטודיו C# טפסים שמציגים טבלאות.
איזה פקד אני צריכה לשים כדי להדפיס את הטבלאות?
וכן, מה הקוד שצריך להיות כתוב מאחורי הפקדים הללו?
תודה מראש. -
-
מקווה שאני לא טועה, הטכנולוגיה WinForms.
-
@dovid הטבלאות מוצגות בפקד בשם DataGridView
ויתכן שמספר השורות יעלה על עמוד אחד -
יש כאן משהו שיכול לעזור לי עכשיו?
-
זה ממש לכתוב קוד רציני, המון קוד מסובך, או להשתמש בספריות לא הכי רשמיות ולהסתבך מאוד עם הRTL ועוד דברים.
יש כמה דרכים עוקפות אלגנטיות:
א. לייצא לHTML, ולהציג בדפדפן.
ב. לייצא לHTML ולהציג בפקד WebBrowser. במקרה הזה ניתן ישירות להדפיס ע"י קוד. -
דוגמה:
private void PrintDgv(DataGridView dgv) { var strB = new StringBuilder(); strB.Append("<table>"); strB.Append("<thead><tr>"); foreach (DataGridViewColumn col in dgv.Columns) { strB.Append("<th>"); strB.Append(col.HeaderText); strB.Append("</th>"); } strB.Append("</tr></thead>"); bool odd = true; foreach (DataGridViewRow row in dgv.Rows) { strB.Append("<tr>"); foreach (DataGridViewCell cell in row.Cells) { strB.Append("<td>"); strB.Append(cell.Value); strB.Append("</td>"); } strB.Append("</tr>"); } strB.Append("</table>"); var webBrowser1 = new WebBrowser(); webBrowser1.Visible = false; webBrowser1.Parent = this; webBrowser1.DocumentText = strB.ToString(); webBrowser1.DocumentCompleted += (s, e) => webBrowser1.ShowPrintPreviewDialog(); } -
@Aharon-0 לא מבין מה לא מובן בשאלה,
לא מבין איך אקסל עוזר, לא רוצים שהמשתמש יצטרך לפתוח תוכנה ולהדפיס ולא בכל מחשב יש אקסל.
ולגבי שימוש בפקד של הדפסה, אתה מוזמן להביא קוד שעושה את זה עם טבלה מרובת עמודים, מבטיח לך שהקוד שלי פשוט יותר. -
@dovid צריך בשביל זה חיבור לאינטרנט?
(אני לא מתמצאת בHTML) -
@dovid כרגע אין לי את התוכנה במחשב.
מקווה לעשות את זה מחר בעז"ה.
בכ"א תודה רבה!! -
@dovid שמתי היום את הקוד, וזה באמת הדפיס לי. תודה רבה!
כמה שאלות: -
הנה תיקונים קוד לשלושת הדברים,
- זה הוספת סגנון CSS לטבלה, עשיתי את זה להלן בשורות 6-11
- הוספתי תנאי col.Visible בשורה 16
- הוספתי גוף html עם תכונת rtl (שורה 5)
private void PrintDgv(DataGridView dgv) { var strB = new StringBuilder(); strB.Append(@"<html dir='rtl'><head><style> table { border-collapse: collapse; } td { border: 1px solid gray; } </style></head><body><table><thead><tr>"); foreach (DataGridViewColumn col in dgv.Columns) if (col.Visible) { strB.Append("<th>"); strB.Append(col.HeaderText); strB.Append("</th>"); } strB.Append("</tr></thead>"); bool odd = true; foreach (DataGridViewRow row in dgv.Rows) { strB.Append("<tr>"); foreach (DataGridViewCell cell in row.Cells) { strB.Append("<td>"); strB.Append(cell.Value); strB.Append("</td>"); } strB.Append("</tr>"); } strB.Append("</table></body></html>"); var html = strB.ToString(); File.WriteAllText(@"d:\temp.html",html); var webBrowser1 = new WebBrowser(); webBrowser1.Visible = false; webBrowser1.Parent = this; webBrowser1.DocumentText = strB.ToString(); webBrowser1.DocumentCompleted += (s, e) => webBrowser1.ShowPrintPreviewDialog(); } יש לציין שמציג הhtml של winforms הוא ישן נושן, תואם IE6 אולי עם אפשרות שדורג ל9 שגם הוא כבר ממש לא דפדפן מודרני, וההשלכה של זה היא שהעיצוב מוגבל וקצת מסובך בתאימות. יש שני דרכים אחרות: להשתמש בwebView2 או להפעיל מאחורי הקלעים את כרום אבל זה מחייב שבמחשב המשתמש יש כרום.
-
@dovid תודה רבה!
סליחה על כל ההטרדה אבל יש לי עוד שאלה.
יש לי ComboBox שמכיל רשימת שמות מטבלה מסוימת.
בטבלה זו ישנם שמות שרשומים כמה פעמים.
ברצוני שב ComboBox יראו כל שם פעם אחת.
האם יש אפשרות לעשות את זה? אם כן איך?
תודה מראש. -
@Sara-Rivka
א. את צריכה לפתוח על כך נושא חדש
ב. את צריכה לבציג את הקוד שממלא את הקומבובוקס -
@dovid שאלות נוספות בקשר לנושא הקודם:
א. שמתי את הקוד שנתת, וזה באמת מציג את הטבלה עם עיצוב של טבלה, והוריד מהכותרת את שמות העמודות המוסתרות. אבל- את העמודה המוסתרת עדיין רואים. (מצורפת תמונה)
איך מבטלים את זה?
(העמודה המוקפת זו עמודה מוסתרת שאת הכותרת שלה לא רואים בגלל הקוד שהוספתי)ב. איך ממרכזים את הטקסט?
-
א. אכן פדיחה שלי, אבל כדאי שתצליחו לראות את הבעיה בקוד (זה ממש פשוט) ולתקן בעצמכם, כי ככה לא תשתעבדו לתשובות פה. מה שקורה שיש שתי לולאות, אחת לכותרות ואחת לכלל השורות, ואת התנאי שמתי רק בלולאה של הכותרות.
ב. אם רוצים למרכז בהכל צריך להוסיף הוראתtext-align: center;
בCSS בסלטור של הtd,
אבל אם רוצים עמודות מסויימות אז צריך להוסיך את זה inline בלולאה. אם זה המקרה, אז אני שואל האם הם כבר ממורכזות גם בDataGridView? -
@dovid כתב בעזרה בטפסי ויזואל סטודיו C#:
א. אכן פדיחה שלי, אבל כדאי שתצליחו לראות את הבעיה בקוד (זה ממש פשוט) ולתקן בעצמכם, כי ככה לא תשתעבדו לתשובות פה. מה שקורה שיש שתי לולאות, אחת לכותרות ואחת לכלל השורות, ואת התנאי שמתי רק בלולאה של הכותרות.
ניסיתי לזהות את הבעיה בקוד, אבל אני לא כ"כ מתמצאת בתוכנה (זה פרויקט במגמה, והמורה זנחה אותנו לחסדי "תחומים"), ניסית להוסיף בשורה של התנאי תנאי גם עבור העמודות, אבל זה סימן לי את זה בתלתל אדום, אז שאלתי פה.
אגב שמתי לב שבשורה הזאת:
@dovid כתב בעזרה בטפסי ויזואל סטודיו C#:
File.WriteAllText(@"d:\temp.html",html);
הFILE מסומן לי בתלתל אדום, אז העברתי את זה להערה, מה מסמלת המילה הזאת?
14/21