ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل پانزدهم کنترلهای فرم ویندوزدر #C

<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Courier; panose-1:2 7 4 9 2 2 5 2 4 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tms Rmn"; panose-1:2 2 6 3 4 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Helv; panose-1:2 11 6 4 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"New York"; panose-1:2 4 5 3 6 5 6 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:System; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Mincho"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS 明朝"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-pitch:fixed; mso-font-signature:-1610612033 1757936891 16 0 131231 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:바탕; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:PMingLiU; panose-1:2 1 6 1 0 1 1 1 1 1; mso-font-alt:新細明體; mso-font-charset:136; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"MS ゴシック"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:돋움; mso-font-charset:129; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimHei; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:黑体; mso-font-charset:134; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:MingLiU; panose-1:2 1 6 9 0 1 1 1 1 1; mso-font-alt:細明體; mso-font-charset:136; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:Mincho; panose-1:2 2 6 9 4 3 5 8 3 5; mso-font-alt:明朝; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Gulim; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:굴림; mso-font-charset:129; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:Century; panose-1:2 4 6 4 5 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:Mangal; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:8192 0 0 0 0 0;} @font-face {font-family:Latha; panose-1:2 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:262144 0 0 0 0 0;} @font-face {font-family:Sylfaen; panose-1:1 10 5 2 5 3 6 3 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:12583555 0 0 0 13 0;} @font-face {font-family:Vrinda; panose-1:1 1 6 0 1 1 1 1 1 1; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Raavi; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Shruti; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Sendnya; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Gautami; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Tunga; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"Estrangelo Edessa"; panose-1:3 8 6 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:"Arial Unicode MS"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Cambria; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1073741899 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:1627400839 -2147483648 8 0 66047 0;} @font-face {font-family:"Segoe UI"; panose-1:2 11 5 2 4 2 4 2 2 3; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-536861953 -1073733541 9 0 479 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:0cm; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} h1 {mso-style-priority:5; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 1 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:1; font-size:15.0pt; mso-bidi-font-size:18.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; mso-font-kerning:0pt; font-weight:bold;} h2 {mso-style-priority:6; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 2 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:2; font-size:13.0pt; mso-bidi-font-size:16.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} h3 {mso-style-priority:7; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 3 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:3; font-size:11.0pt; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} h4 {mso-style-priority:8; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 4 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:4; font-size:11.0pt; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:normal;} h5 {mso-style-priority:9; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 5 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:5; font-size:11.0pt; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:normal; font-style:italic;} h6 {mso-style-priority:10; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Heading 6 Char"; mso-style-next:Normal; margin-top:10.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; mso-outline-level:6; font-size:10.0pt; mso-bidi-font-size:13.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} p.MsoDocumentMap, li.MsoDocumentMap, div.MsoDocumentMap {mso-style-unhide:no; mso-style-link:"Document Map Char"; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:8.0pt; font-family:"Tahoma","sans-serif"; mso-fareast-font-family:"Times New Roman";} p {mso-style-priority:1; mso-style-unhide:no; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:0cm; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.MsoAcetate, li.MsoAcetate, div.MsoAcetate {mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; mso-style-link:"Balloon Text Char"; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:8.0pt; font-family:"Tahoma","sans-serif"; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast;} span.MsoPlaceholderText {mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; color:gray;} p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; margin-bottom:.0001pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:36.0pt; margin-bottom:.0001pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast {mso-style-priority:34; mso-style-unhide:no; mso-style-qformat:yes; mso-style-type:export-only; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:36.0pt; mso-add-space:auto; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.MsoQuote, li.MsoQuote, div.MsoQuote {mso-style-priority:1; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"Quote Char"; mso-style-next:Normal; margin-top:0cm; margin-right:36.0pt; margin-bottom:10.0pt; margin-left:36.0pt; mso-pagination:widow-orphan; font-size:11.0pt; mso-bidi-font-size:10.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi; color:black; mso-themecolor:text1;} span.Heading1Char {mso-style-name:"Heading 1 Char"; mso-style-priority:5; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 1"; mso-ansi-font-size:15.0pt; mso-bidi-font-size:18.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} span.Heading2Char {mso-style-name:"Heading 2 Char"; mso-style-priority:6; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 2"; mso-ansi-font-size:13.0pt; mso-bidi-font-size:16.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} span.Heading3Char {mso-style-name:"Heading 3 Char"; mso-style-priority:7; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 3"; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} span.Heading4Char {mso-style-name:"Heading 4 Char"; mso-style-priority:8; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 4"; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191;} span.Heading5Char {mso-style-name:"Heading 5 Char"; mso-style-priority:9; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 5"; mso-bidi-font-size:14.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-style:italic;} span.Heading6Char {mso-style-name:"Heading 6 Char"; mso-style-priority:10; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Heading 6"; mso-ansi-font-size:10.0pt; mso-bidi-font-size:13.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} p.Publishwithline, li.Publishwithline, div.Publishwithline {mso-style-name:"Publish with line"; mso-style-noshow:yes; mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:16.0pt; mso-bidi-font-size:19.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:major-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:major-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:major-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:major-bidi; color:#17365D; mso-themecolor:text2; mso-themeshade:191; font-weight:bold;} p.PublishStatus, li.PublishStatus, div.PublishStatus {mso-style-name:"Publish Status"; mso-style-noshow:yes; mso-style-unhide:no; margin-top:6.0pt; margin-right:0cm; margin-bottom:2.0pt; margin-left:0cm; mso-pagination:widow-orphan; background:#FDEB9F; border:none; mso-border-alt:solid #FDBD5E .5pt; padding:0cm; mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt; font-size:9.0pt; mso-bidi-font-size:13.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.PublishStatusAccessible, li.PublishStatusAccessible, div.PublishStatusAccessible {mso-style-name:PublishStatus_Accessible; mso-style-noshow:yes; mso-style-unhide:no; margin-top:6.0pt; margin-right:0cm; margin-bottom:2.0pt; margin-left:0cm; mso-pagination:widow-orphan; border:none; mso-border-alt:solid #FDBD5E .5pt; padding:0cm; mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt; font-size:9.0pt; mso-bidi-font-size:13.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.Account, li.Account, div.Account {mso-style-name:Account; mso-style-noshow:yes; mso-style-unhide:no; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:3.6pt 63.35pt; font-size:9.0pt; mso-bidi-font-size:12.0pt; font-family:"Segoe UI","sans-serif"; mso-fareast-font-family:"Segoe UI"; color:#4F81BD;} p.Categories, li.Categories, div.Categories {mso-style-name:Categories; mso-style-noshow:yes; mso-style-unhide:no; mso-style-parent:Account; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:3.6pt 63.35pt; font-size:9.0pt; mso-bidi-font-size:12.0pt; font-family:"Segoe UI","sans-serif"; mso-fareast-font-family:"Segoe UI"; color:#4F81BD;} p.PadderBetweenTitleandProperties, li.PadderBetweenTitleandProperties, div.PadderBetweenTitleandProperties {mso-style-name:"Padder Between Title and Properties"; mso-style-noshow:yes; mso-style-unhide:no; margin-top:0cm; margin-right:0cm; margin-bottom:1.0pt; margin-left:0cm; mso-pagination:widow-orphan; font-size:1.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.PadderBetweenControlandBody, li.PadderBetweenControlandBody, div.PadderBetweenControlandBody {mso-style-name:"Padder Between Control and Body"; mso-style-noshow:yes; mso-style-unhide:no; mso-style-next:Normal; margin-top:0cm; margin-right:0cm; margin-bottom:6.0pt; margin-left:0cm; mso-pagination:widow-orphan; font-size:1.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} p.underline, li.underline, div.underline {mso-style-name:underline; mso-style-noshow:yes; mso-style-unhide:no; mso-style-parent:""; margin-top:2.0pt; margin-right:0cm; margin-bottom:0cm; margin-left:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; border:none; mso-border-bottom-alt:solid #4F81BD 1.0pt; mso-border-bottom-themecolor:accent1; padding:0cm; mso-padding-alt:0cm 0cm 2.0pt 0cm; font-size:1.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} span.QuoteChar {mso-style-name:"Quote Char"; mso-style-priority:1; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:Quote; color:black; mso-themecolor:text1;} span.BalloonTextChar {mso-style-name:"Balloon Text Char"; mso-style-noshow:yes; mso-style-priority:99; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Balloon Text"; mso-ansi-font-size:8.0pt; mso-bidi-font-size:8.0pt; font-family:"Tahoma","sans-serif"; mso-ascii-font-family:Tahoma; mso-hansi-font-family:Tahoma; mso-bidi-font-family:Tahoma;} span.DocumentMapChar {mso-style-name:"Document Map Char"; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"Document Map"; mso-ansi-font-size:8.0pt; mso-bidi-font-size:8.0pt; font-family:"Tahoma","sans-serif"; mso-ascii-font-family:Tahoma; mso-fareast-font-family:"Times New Roman"; mso-hansi-font-family:Tahoma; mso-bidi-font-family:Tahoma;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single; color:teal;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:red;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-bidi-font-size:10.0pt; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:"Times New Roman"; mso-fareast-theme-font:minor-fareast; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:Arial; mso-bidi-theme-font:minor-bidi;} .MsoPapDefault {mso-style-type:export-only; margin-bottom:10.0pt;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 72.0pt 72.0pt 72.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

[Enter Post Title Here]

 

 

 فصل پانزدهم

C#در کنترلهای فرم ویندوز

آنچه که در این فصل یاد خواهید گرفت:

مقدمه : یک دیاگرام س لسله مراتب کلاس، روش مناسبی برای گرو ه بندی کنترل های فرم بر اساس عملکرد آن

پیشنهاد میکند.

طراحی شده اند تا برای کاربران امکان یک RadioButton و CheckBox ،Button • کنترلهای دکمه : کنترلهای

یا چند انتخاب را فراهم سازند.

برای نمایش و مقیا س بندی تصاویر استفاده م ی شود . PictureBox • کنترلهای کادر متنی و کادر عک س : کنترل

برای نمایش و ویرایش یک یا چند خط از متن بکار برده میشود. TextBox کنترل

واسط های مختلفی برای نمایش و دستکاری CheckListBox و ComboBox ،ListBox • کنترل لیست : کنترلهای

داده در یک لیست پیشنهاد میکنند.

چندین نما برای نمایش اقلام داده و آیکو ن های انتساب شده ListView کنترل : TreeView و ListView • کنترل

اطلاعات سلسله مراتبی را در یک ساختار درختی قابل پ ی گیری ارائه TreeView به آنها ارائه م ی کند. کنترل

میکند.

یک تایمر برای کنترل ز مانی که باید یک رویداد احضار شود، استفاده م ی شود . :ProgressBar و Timer • کنترل

پیشرفت یک عمل را بصورت بصری نمایش میدهد. ProgressBar یک

ایجاد یک کنترل کاربر ی : زمانی که هیچ کنترلی نیاز کاربر را برآورده نم ی کند، می توان با استفاده از ترکیب چند

کنترل یا اضافه کردن ویژگیهایی به یک کنترل، کنترل سفارشی ایجاد کرد.

انتقال داده ها مابین کنتر ل ها : یک روش ساده برای کپی کردن یا انتقال قلم داد ه ای از یک کنترل به یک کنترل

تعداد متنوعی از کلا س ها و رویدادها برای پیادهسازی این ویژگی فراهم Net. . دیگر، کشیدن و رها کردن م ی باشد

میسازد.

کاربرد منا بع: منابع مورد نیاز یک برنامه همچون عنوان، برچس ب های توصیفی و تصاویر م ی توانند در یک اسمبلی

محلی یا سراسری تعبیه شوند. این ویژگی مخصوصاً برای توسعه برنامههای کاربردی بین المللی مفید هستند.

mohsen_mahyar@yahoo.com

220

متدها، خصوصیات و رویدادهای آن بررسی ش د . این فصل ویژگ ی های تک به تک کنتر ل ها را ،Control در فصل قبلی کلاس

بررسی میکند.

سفارشی برای GUI فرمهای ویندوز فقط برای کاربرد کنتر ل های درونی استاندارد محدود نشد ه اند. می توان کنتر ل های

توسعه کنترل های موجود ایجاد کرد. میتوان یک کنترل کاملاً جدید یا کنترلی بر اساس کنترلهای موجود ایجاد کرد . چند

مثال این فصل، نحو ه ی توسعه یک کنترل و ایجاد یک کنترل کاربری را ارائه م ی کنند. این فصل نگاهی بر فای ل های منبع و

جهت پشتیبانی کاربران کشورها و فرهنگهای مختلف دارد. GUI نحوه استفاده از آنها در تولید برنامههای کاربردی

فرمهای ویندوز NET. -1-15 مطالعه کنترلهای

یک خانواد ه ی بزرگ از کنتر ل ها در بر دارد که به واسط کاربری مبتنی بر ویندوز، System.Windows.Forms فضای نامی

را به ارث م ی برد. سپس متدها، Control شکل و توانایی عمل م ی دهد. هر کنترلی یک مجموعه مشترک از اعضای کلاس

خصوصیات و رویدادهایی به آن کنترل اضافه میکند تا ظاهر و رفتار متمایز خود را پیدا کند.

1 سلسله مراتب ار ث بری کنترل های فرم های ویندوز را نشان م ی دهد. کنترلهای علامت گذاری شده بوسیله * - شکل 15

،DataGridView با DataGrid فراهم شد ه اند . مخصوصاً .x1NET . 2,0 و NET . برای فراهم کردن سازگاری مابین

1 خلاص ه ای از کنتر ل های - جانشین شده اس ت . جدول 15 ToolStrip با Toolbar و StatusStrip با StatusBar

معمول این سلسله مراتب را فراهم میکند.

1- شکل 15

1- جدول 15

کنترل کاربرد توصیف

فصل پانزدهم کنترل های فرم ویندوز

221

زمانی که یک کلیک ماوس رخ Button

میدهد یا در زمان فشار دادن

یک ESC یا Enter کلید

رویداد آزاد میکند.

آن عنوان Text یک دکمه روی فرم نشان م ی دهد. خصوصیت

روی دکمه را تعیین میکند

به کاربر اجازه م ی دهد یک یا CheckBox

چند گزینه را انتخاب کند.

یک کادر انتخاب به همراه یک متن یا تصویر در کنار آن دار د .

میتوان کادر انتخاب را به صورت یک دکمه نشان داد.

CheckBox1.Appearance = Appearance.Button

لیستی از اقلام را نشان CheckedListBox

میدهد.

به همراه یک کادر انتخاب در قبل از هر قلم داده ListBox

و TextBox عملکرد ComboBox

را با هم فراهم ListBox

میسازد.

کنترل ترکیبی که یک کادر متنی در یک لیست بازشو دربر

را ترکیب ListBox و TextBox دارد. خصوصیات دو کنترل

میکند.

DataGridView

GridView

دادهها را در یک قالب

شبکهای دستکاری میکند

بهترین کنترل برای نمایش داد ه های رابطه ای DataGridView

DataGridView . است. آن به پایگاه داده نیز مقید م ی شود

است. DataGrid آمده است و جانشین Net در. 20

کنترلها را گروهبندی میکند اصولاً برای گرو ه بندی دکمه های رادیویی بکار م ی رود. آن یک GroupBox

حاشیه در اطراف کنترلهای دربرگیرنده قرار میدهد.

یک کلکسیون از تصاویر را ImageList

مدیریت میکند

این کنترل ظرف یک کلکسیون از تصاویر را نگه م ی دارد. این

و ListView ،ToolStrip تصاویر توسط کنتر ل هایی همچون

استفاده میشود. TreeView

اطلاعات توصیفی به فرم Label

اضافه میکند

متونی که محتویات یک کنترل یا نحو ه ی استفاده از یک کنترل

را شرح میدهند.

یک لیست از اقلا م را نشان ListBox

میدهد. ممکن است یک یا

چند تا از آنها انتخاب شوند.

ممکن است متون یا اشیاء ساده را در بر گیر د . متدها،

خصوصیات و رویدادهای آن، عملیات انتخاب، تغییر، اضافه

کردن و مرتبسازی اقلام را مجاز میدارند.

اقلام داده و زیر اقلام داده را ListView

نمایش میدهد.

آن می تواند یک قالب شبک ه ای داشته باشد که هر سطری یک

قلم داده مختلف و زیر قلم داد ه های آن را نمایش م ی دهد .

امکان نمایش قلم دادهها بصورت آیکون وجود دارد.

یک منو به یک فرم اضافه MenuStrip

میکند.

یک سیستم منو و زیرمنو برای یک فرم فراهم م ی کند . آن

است. MainMenu جانشین کنترل

Panel

FlowPanlelayaout

TablePanellayaout

کنترلها را گرو ه بندی می کند

.

یک ظرف قابل مشاهده یا غیرقابل مشاهده برای گرو ه بندی

کنترلهاست. میتواند نوارهای لغزنده داشته باشد.

بطور اتوماتیک کنتر ل ها را بصورت FlowPanlelayaout

TablePanellayaout . افقی یا عمودی ترازبندی م ی کند

کنترلها را در یک شبکه ترازبندی میکند

یک تصویر را در بر میگیرد. برای نگهداری تصاویر با قال ب های استاندارد متنوع بکار PictureBox

میرود. بعضی از خصوصیات مربوط به نحوه قرار گرفتن عکس

mohsen_mahyar@yahoo.com

222

و تغییر اندازه عکس را فراهم میسازد.

پیشرفت یک عمل را نشان ProgressBar

میدهد.

یک نوار پیشرفت نمایش م ی دهد که یک بازخورد از پیشرفت

یک عمل همچون کپی فایل را به کاربر میدهد.

این کنترل به کاربر اجازه RadioButton

میدهد از میان چند گزینه،

یکی را انتخاب کند

یک دکمه رادیویی ویندوز را نشان میدهد.

یک مجموعه از قا ب ها را برای StatusStrip

نمایش حالت یک برنامه فراهم

میکند.

یک نوار حالت برای نمایش اطلاعات فعالی ت های جاری فرم را

فراهم میسازد.

ورودی کاربر را میپذیرد. میتواند یک ورودی تک یا چند خطی را بپذیر د . با استفاده از TextBox

خصوصیات آن م ی توان کلمات عبور، نوار لغزنده، تنظیم حالت

حروف و محدودیت فقط خواندنی آن را مشخص کرد.

دادهها را همانند گر ه های یک TreeView

درخت نمایش میدهد.

عملیاتی همچون باز کردن و بستن گر ه ها، اضافه کردن، حذف

کردن و کپی کردن گرهها در درخت را پشتیبانی میکند.

در این بخش کنتر ل ها بطور دقیق بررسی نم ی شوند، فقط برخی از خصوصیات بسیار معمول و کارآی کنتر ل ها عنوان

میشوند.

Label و Panel ،GroupBox ،Button -2-15 کلاسهای

Button -1-2-15 کلاس

دکمه، معمول ترین روش قادر ساختن یک کاربر برای شروع یک فعالیت اس ت . بطور مع مول، دکمه به کلیک ماوس یا ضربه

کلید با رها کردن یک رویداد کلیک پاسخ میدهد، که این رویداد بوسیله یک متد اداره کننده رویداد اداره میشود.

Constructor : Public Button ()

دکمه، عنوان آن را تعیین م یکند و م ی توان یک Text سازنده این کلاس یک نمونه بدون برچسب ایجاد م ی کند. خصوصیت

آن برای قراردادن یک تصویر روی پس زمینه دکمه استفاده Image کلید دسترسی برای آن دکمه تعریف کر د . خصوصیت

میشود.

تنظیم ظاهر یک دکمه

سبکهای دکمه به قراردادن متن و یک تصویر روی دکمه محدود م ی شوند. میتوان آنرا صاف یا سه بعدی کرد و رنگ نوشته

و پس زمین ه ی آن را به هر رنگ موجود تنظیم کر د . خصوصیات زیر برای تعریف ظاهر دکمهها، کادرهای انتخاب و دکمه های

رادیویی استفاده میشوند.

و Flatstyle.Standard ،Flatstyle.Popup ،Flatstyle.Flat : میتواند چهار مقدار بگیر د :Flatstyle

یک دکمه صاف ایجاد می کند، Popup . یک دکمه صاف ایجاد م ی کند Flat گزینه .Flatstyle.System.Standard

مناسب با سبک سیستم عامل یک دکمه درست میکند. System . ولی با رفتن ماوس بر روی آن سه بعدی میشود

برای ایجاد یک شی تص و یر از یک Image.FromFile تصویری برای قرار گرفتن روی دکمه تعیین م ی کند. متد :Image

فایل خاص استفاده میشود.

button1.Image =Image.FromFile ("c:\\book.gif");

فصل پانزدهم کنترل های فرم ویندوز

223

مشخص ContentAlignment محل تصویر روی دکمه را مشخص م ی کند. مقدار آن با نوع شمارشی :ImageAlign

میگردد.

button1 .ImageAlign =ContentAlignment .MiddleRight;

مشخص میکند. ContentAlignment محل متن روی عکس را با استفاده از مقادیر :TextAlign

Button اداره کردن رویدادهای

یا Enter دکمه م ی تواند به چندین روش رها گرد د : بوسیله کلیک دکمه ماوس، با فشار دادن کلید Click یک رویداد

و کلید دسترسی. Alt یا با فشار دادن کلید ترکیبی SpaceBar

کنترل ایجاد م ی شود. قطعه کد زیر یک Text یک ک لید دسترسی با قراردادن & قبل از یکی از کاراکترهای مقدار خصوصیت

ثبت میکند. Click قرار میدهد و یک اداره کننده رویداد برای رویداد C دکمه اعلان میکند، کلید دسترسی آن را

Button btnClose = new Button();

btnClose.Text= "&Close"; // Pushing ALT + C triggers event

btnClose.Click += new EventHandler(btnClose_Clicked);

// Handle Mouse Click, ENTER key, or Space Bar

private void btnClose_Clicked(object sender, System.EventArgs e)

{

this.Close();

}

دکمه میتواند حتی در صورتی که فوکس روی آن نباشد نیز رخ دهد. Click توجه داشته باشید که رویداد

Enter دکمه با فشار دادن کلیدهای Click مشخص م ی کنند که رویداد CancelButton و AcceptButton خصوصیات

رها شوند. ESC یا

آن فرم را میبند د. Click فرم را روی دکمه ای تنظیم کنید که رویداد Cancelbutton توجه: خصوصیت

فراهم میکند. Esc این یک روش ساده برای بستن یک پنجره بوسیله کلید

CheckBox -2-2-15 کلاس

که م ی توان فقط یکی از RadioButton با این کنترل م ی توان یک ترکیب از گزین ه های روی یک فرم را انتخاب کر د . برخلاف

اعضای گروه را انتخاب کرد.

Constructor : Public CheckBox()

قراردادن یک متن Image و Text یک کادر انتخاب انتخاب نشده و بدون برچسب توسط سازنده ایجاد م ی شود. خصوصیات

یا تصویر اختیاری را در کنار کادر انتخاب ممکن ساختهاند.

CheckBox تنظیم ظاهر

کادرهای انتخاب در دو سبک نمایش داده م ی شوند: بصورت یک ک ا در انتخاب سنتی دنبال شده با متن (یا یک تصویر ) یا

بصورت یک دکمه دو وضعیتی (اگر صاف باشد، انتخاب شده و اگر برآمده باشد، انتخاب نشده اس ت ). ظاهر کنترل با تنظیم

انجام م ی شود. کد زیر Appearance.Button یا Appearance.normal به یکی از دو مقدار Appearance خصوصیت

2 را ایجاد میکند. - دو کادر انتخاب نمایش داده شده در شکل 15

// Create traditional check box

this.checkBox1 = new CheckBox();

this.checkBox1.Location =new System.Drawing.Point(10،120);

mohsen_mahyar@yahoo.com

224

this.checkBox1.Text = "La Traviata";

this.checkBox1.Checked = true;

// Create Button style check box

this.checkBox2 = new CheckBox();

this.checkBox2.Location =new System.Drawing.Point(10،150);

this.checkBox2.Text = "Parsifal";

this.checkBox2.Appearance = Appearance.Button;

this.checkBox2.Checked = true;

this.checkBox2.TextAlign = ContentAlignment.MiddleCenter;

2- شکل 15

RadioButton -3-2-15 کلاس

یک کنترل انتخابی است که شبیه کادر انتخاب عمل م ی کند، به استثناء اینکه در هر گروه فقط م ی توان یک RadioButton

مورد را انتخاب کرد. یک گروه شامل چندین کنترل موجود در یک ظرف یکسانی است.

Constructor : Public RadioButton()

می دهند Image و Text انتخاب نشده و بدون هیچ متنی توسط سازنده ایجاد م ی شود. خصوصیات RadioButton یک

یک متن اختیاری یا یک تصویر در کنار کادر قرار گیرن د . ظاهر دکمه رادیویی بوسیله خصوصیاتی مشابه کادر انتخاب یا دکمه

.Flatstyle و Appearance : تعریف میشوند

قراردادن دکمههای رادیویی در یک گروه

دکمههای رادیویی قرار گرفته در یک گروه اجازه م ی دهند، فقط یکی از آنها انتخاب شون د . برای مثال، ده سؤال چند

گزینهای، ده گروه دکمه رادیویی نیاز دارن د . در کنار نیاز به عملکرد گرو ه ها، آنها یک فرصت برای ایجاد یک طرح زیبا فراهم

میسازند.

تصاویر پشت زمینه و سب ک های مختلف را پشتیبانی م ی کنند که م ی توانند GroupBox وPanel اغلب کنترل های ظرف

که یک تصویر پشت زمینه GroupBox 3 قرار دادن دکم ه های رادیویی روی یک - ظاهر یک فرم را بهبود دهن د . شکل 15

دارد را نشان میدهد.

3- شکل 15

فصل پانزدهم کنترل های فرم ویندوز

225

استفاده م ی شود و برای GroupBox 1 قط عه کدی ارائه م ی دهد که برای قراردادن دکم ه های رادیویی روی کنترل - مثال 15

اینکه تصویر پشت دکمهها دیده شود، آنها را شفاف میسازد.

1- مثال 7

using System.Drawing;

using System.Windows.Forms;

public class OperaForm : Form

{

private RadioButton radioButton1;

private RadioButton radioButton2;

private RadioButton radioButton3;

private GroupBox groupBox1;

public OperaForm()

{

this.groupBox1 = new GroupBox();

this.radioButton3 = new RadioButton();

this.radioButton2 = new RadioButton();

this.radioButton1 = new RadioButton();

// All three radio buttons are created like this

// For brevity only code for one button is included

this.radioButton3.BackColor = Color.Transparent;

this.radioButton3.Font = new Font("Microsoft Sans Serif",8,25F,

FontStyle.Bold);

this.radioButton3.ForeColor =SystemColors.ActiveCaptionText;

this.radioButton3.Location = new Point(16, 80);

this.radioButton3.Name = "radioButton3";

this.radioButton3.Text = "Parsifal";

// Group Box

this.groupBox1 = new GroupBox();

this.groupBox1.BackgroundImage =Image.FromFile("C:\\opera.jpg");

this.groupBox1.Size = new Size(120, 112);

// Add radio buttons to groupbox

groupBox1.Add( new Control[]{radioButton1,radiobutton2,radioButton3});

}

}

یک Backcolor . قرار داده م ی شود Color.Transparent ، دکمه رادیویی Backcolor توجه کنید که خصوصیت

خصوصیت محدود شده است، بدین معنی که آن رنگ کنترل پدر خود را م ی گیرد. اگر هیچ رنگی به دکمه رادیویی انتساب

را گرفته و تصویر را پنهان میکند. GroupBox کنترل Backcolor داده نشود، آن

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

226

GroupBox -4-2-15 کلاس

یک کنترل ظرف است که یک حاشیه در اطراف کلکسیون کنتر ل های خود قرار م ی دهد. همانطور که در مثال GroupBox

قبلی نشان داده شد، آن اغلب برای گرو ه بندی دکمههای رادیویی استفاده میشود. اما آن یک روش مناسب و راحت برای

آن به مقدار Enabled سازماندهی و مدیریت کنتر ل های مرتبط به هم روی یک فرم اس ت . برای مثال، قرار دادن خصوصیت

همه کنترلهای کادر گروه غیرفعال میگردند. ،False

Constructor : public GroupBox()

بدون عنوان با عرض 200 پیکسل و ارتفاع 100 پیکسل توسط سازنده آن ایجاد میگردد. GroupBox بطور پیشفرض، یک

Panel -5-2-15 کلاس

این کلاس به عنوان یک ظرف بزرگ برای گرو ه بندی کلکسیونی از کنتر ل ها استفاده م ی شود . آن بسیار شبیه کنترل

است و توانایی لغزاندن را دارد. ScrollableClass است. اما یک فرزند از کلاس GroupBox

Constructor : public Panel()

سازندهی این کلاس، یک ناحیه ظرف بدون حاشیه ایجاد م ی کند که توانایی لغزاندن آن نیز غیرفعال است. بطور پیش فرض،

رنگ پس زمینهی ظرف خود را میگیرد، بطوریکه روی فرم غیرقابل مشاهده میگردد. Panel

هدف یکسانی را مدنظر دارند، اغلب برنام ه نویسها با سؤالی در مورد انتخاب یکی از آنها روبرو Panel و GroupBox چون

هستند؟

ندارد. Panel میتواند یک عنوان قابل مشاهده داشته باشد، در حالی که کلاس GroupBox •

معین م ی گردد . که BorderStyle با خصوصیت Panel همیشه یک حاشیه نشان م ی دهد. حاشیه GroupBox •

باشد. Borderstyle.Fixed3D ،Borderstyle.Single ،Borderstyle.None مقدار آن میتواند

بصورت Panel کنترل Autoscroll قرار دادن خصوصیت True امکان لغزاندن ندارد، در حالیکه با GroupBox •

اتوماتیک لغزان میشود.

برای قراردادن یا تنظیم کنتر ل های روی خود، هیچ ویژگی پیشنهاد نم ی کند. به همین د لیل، زمانی که شمای Panel •

کنترلها در زمان طراحی معین باشند استفاده م ی شود، اما این همیشه ممکن نیس ت . بیشتر برنامه های کاربردی یک

دو NET. ، فرم بوسیله کنتر ل های مبتنی بر حالت زمان اجرا تولید م ی کنند. برای پشتیبانی از ایجاد پویایی کنتر ل ها

ارث بری می کنند و محل کنتر ل های خود را بصورت اتوماتیک تنظیم م ی کنند : Panel ظرف پیشنهاد م ی کند که از

. TableLayoutPanel و FlowLayoutPanel

FlowLayoutPanel -6-2-15 کنترل

نشان میدهد. FlowLayoutPanel 4 یک طرحبندی از کنترلها را با استفاده از - شکل 15

4-15

فصل پانزدهم کنترل های فرم ویندوز

227

که جهت اضافه FlowDirection این کنترل ساده یک سازنده ب د ون پارامتر و دو خصوصیت با ارزش دار د . خصوصیت

معین م ی کند که آیا کنتر ل های فرزند به سطر دیگری WrapControls شدن کنترل ها به ظرف را معین م ی کند و خصوصیت

منتقل شوند یا طول کنترلها کوتاه شوند.

ایجاد میکند و کنترلهایی به کلکسیون آن اضافه میکند. FlowDirection قطعه کد زیر یک

FlowLayoutPanel flp = new FlowLayoutPanel();

flp.FlowDirection = FlowDirection.LefttoRight;

// Controls are automatically positioned left to right

flp.Controls.Add(Button1);

flp.Controls.Add(Button2);

flp.Controls.Add(TextBox1);

flp.Controls.Add(Button3);

this.Controls.Add(flp); // Add container to form

هستند و TopDown و BottomUp, LeftToRight, RighttoLeft موارد ،FlowDirection اعضای نوع شمارشی

است. LeftToRight مقدار پیشفرض آن

TableLayoutPanel -7-2-15 کنترل

است. TableLayoutPanel 5 طرحبندی شبکهای را نشان میدهد که حاصل استفاده یک ظرف - شکل 15

5- شکل 15

ایجاد م ی کند و همان چهار کنترل مثال قبلی را به آن اضافه م ی کند . در TableLayoutPanel این قطعه کد یک

دور هر سلول Inset خصوصیات ظزف تعیین م ی شود که طر ح بندی شبکه، دو سطر و دو ستون دارد و یک سبک حاشیه

بکار میبرد. کنترلها همواره از چپ به راست و بالا به پائین اضافه میشوند.

TableLayoutPanel tlp = new TableLayoutPanel();

// Causes the inset around each cell

tlp.CellBorderStyle = TableLayoutPanelCellBorderStyle.Inset;

tlp.ColumnCount = 2; // Grid has two columns

tlp.RowCount = 2; // Grid has two rows

// If grid is full add extra cells by adding column

tlp.GrowStyle = TableLayoutPanelGrowStyle.AddColumns;

// Padding (pixels)within each cell (left, top, right, bottom)

tlp.Padding = new Padding(1،1،4،5);

tlp.Controls.Add(Button1);

tlp.Controls.Add(Button2);

// Other controls added here

بسیار با ارزش اس ت . آن مشخص م ی کند در صورت پر شدن سطرها و ستو ن ها، چگونه کنترل های GrowStyle خصوصیت

یک ستون برای افزودن کنتر ل های جدید اضافه م ی کند . AddColumns جدید به آن اضافه شون د . در این مثال، متد

انت خاب شود، در صورتی که شبکه پر شده باشد، با اضافه None هستند . در صورتی که None و AddRows گزینههای دیگر

شدن کنترل جدید، استثنایی رخ میدهد.

mohsen_mahyar@yahoo.com

228

Label -8-2-15 کلاس

این کلاس برای اضافه کردن اطلاعات توصیفی روی یک فرم استفاده میشود.

constructor: public Label()

را بکار Text یک نمونه از برچسب بدون عنوان توسط سازنده ایجاد م ی شود. برای انتساب یک مقدار به برچسب خصوصیت

برای تعریف و زیباسازی ظاهر برچسب استفاده میشوند. TextAlign و BorderStyle ،Image برید. خصوصیات

6 را ایجاد میکند. - کد زیر برچسب نشان داده شده در شکل 15

Label imgLabel = new Label();

imgLabel.BackColor= Color.White;

Image img = Image.FromFile("c:\\rembrandt.jpg");

imgLabel.Image= img;

imgLabel.ImageAlign= ContentAlignment.TopCenter;

imgLabel.Text="Rembrandt";

imgLabel.TextAlign= ContentAlignment.BottomCenter;

imgLabel.BorderStyle= BorderStyle.Fixed3D;

imgLabel.Size = new Size(img.Width+10, img.Height+25);

6- شکل 15

و قرار دادن علامت & قبل از یک کاراکتر True یکی از خصوصیات ناآشنای آن اس ت . با مقداردهی آن به UseMnemonic

دارد با Sum& برچسب، م ی توانید یک کلید دسترسی ایجاد کنی د . برای مثال، اگر یک برچسب مقدار Text در خصوصیت

کانون به آن منتقل میگردد. Alt-S فشار دادن کلیدهای

TextBox و PictureBox -3-15 کنترلهای

PictureBox -1 کلاس -3-15

استفاده میشود. آن PNG یا GIF ،JPEG ،metafile ،Icon ،bitmap برای نمایش تصاویری همچون PictureBox کنترل

یک کنترل پویاست و انتخاب عک س ها در زمان اجرا و طراحی، تغییر اندازه و تغییر موقعی ت کنترل را در زمان اجرا و طراحی

مجاز میدارد.

constructor: public PictureBox()

آن تنظیم میشود تا SizeMode که خصوصیت ،(Image = null) سازندهی این کلاس یک کادر عکس خالی ایجاد میکند

هر تصویری در گوشه بالا سمت چپ کادر نمایش داده شود.

تصویری که در کادر عکس نمایش داده خواهد شد را مشخص Image . است SizeMode و Image دو خصوصیت آشنای آن

انتساب داده شود: PictureBoxSizeMode میکند. آن میتواند به یکی از اعضای نوع شمارشی

با تصویر هم اندازه میشود. PictureBox:AutoSize-1

تصویر در وسط کادر نمایش داده میشود و در صورت نیاز برش داده میشود. :CenterImage -2

فصل پانزدهم کنترل های فرم ویندوز

229

تصویر در گوشه بالا سمت چپ قرار میگیرد و در صورت نیاز برش داده میشود. : Normal -3

تصویر کوچک شده یا کشیده میشود تا با کادر متناسب گردد. :StretchImage -4

را ارائه م ی کند. آن روی فرم سه کادر عکس کوچک برای نگه داشتن PictureBox 7 برخی از ویژگ ی های کنترل - شکل 15

تصاویر کوچک و یک کادر عکس بزرگ برای نمایش تصویر کامل دار د . زمانی که کاربر روی تصویر کوچک دابل کلیک

میکند، تصویر بزرگ نمایش داده میشود.

7- شکل 15

با تنظیم مقدار خصوصیت DoubleClick به هر روی د اد ShowPic 2 واضح اس ت . اداره کننده رویداد - کد موجود در مثال 7

بزرگ به تصویر موجود در عکس کوچک عک س العمل نشان می دهد. توجه داشته باشید که PictureBox کنترل Image

دارند و برای متناسب شدن با کادرهای عکس کوچک، بطور اتوماتیک کوچکتر شد ه اند(با bigPicture تصاویر اصلی اندازه

.( SizeMode تنظیم خصوصیت

2- مثال 15

using System;

using System.Drawing;

using System.Windows.Forms;

public class ArtForm : Form

{

private PictureBox bigPicture;

private PictureBox tn1;

private PictureBox tn2;

private PictureBox tn3;

private Button btnClear;

public ArtForm()

{

bigPicture = new PictureBox();

tn1 = new PictureBox();

tn2 = new PictureBox();

tn3 = new PictureBox();

btnClear = new Button();

bigPicture.Location = new Point(90, 30);

bigPicture.Name = "bigPicture";

bigPicture.Size = new Size(160, 160);

this.Controls.Add(bigPicture);

// Define picturebox to hold first thumbnail image

tn1.BorderStyle = BorderStyle.FixedSingle;

tn1.Cursor = Cursors.Hand;

mohsen_mahyar@yahoo.com

230

tn1.Image = Image.FromFile("C:\\schiele1.jpg");

tn1.Location = new Point(8, 16);

tn1.Name = "tn1";

tn1.Size = new Size(56, 56);

tn1.SizeMode = PictureBoxSizeMode.StretchImage;

this.Controls.Add(tn1);

// Code for other thumbnails would go here

// Button to clear picture box

btnClear.Location = new Point(136, 192);

btnClear.Name = "btnClear";

btnClear.Size = new Size(88, 24);

btnClear.Text = "Clear Image";

this.Controls.Add(btnClear);

btnClear.Click += new EventHandler(this.btnClear_Click);

// Set up event handlers for double click events

tn1.DoubleClick += new EventHandler(ShowPic);

tn2.DoubleClick += new EventHandler(ShowPic);

tn3.DoubleClick += new EventHandler(ShowPic);

}

static void Main()

{

Application.Run(new ArtForm());

}

private void btnClear_Click(object sender, EventArgs e)

{

bigPicture.Image = null; // Clear image

}

private void ShowPic (object sender, EventArgs e)

{

// Sender is thumbnail image that is double clicked

bigPicture.Image = ((PictureBox) sender).Image;

}

}

TextBox -2 کلاس -3-15

یک کنترل آسان است که چند خصوصیت مؤثر روی ظاهرش دارد و تعدادی از خصوصیات، ،TextBox کنترل آشنای

محتوای آن را کنترل م ی کنند. توسعه دهنده بوسیله تنظیم اداره کنند ه های رویداد و روتی ن های بازبینی، داد ه های وارد شده

در کادر متنی را کنترل میکنند.

constructor: public TextBox()

ایجاد م ی کند که یک خط متن م ی پذیرد و رنگ و فونت ظرف به آن انتساب داده م ی شود . TextBox سازنده این کلاس، یک

به آسانی م ی توان کنترل را به یک کادر اداره کننده متن چند خطی تبدیل کرد که تعداد خاصی کاراکتر م ی پذیرد و آنها را به

8، برخی از خصوصیات آن را ارائه میکند. - چپ، راست یا وسط تنظیم میکند. شکل 15

8- شکل 15

فصل پانزدهم کنترل های فرم ویندوز

231

متنی در کادر متنی قرار میگیرد. AppendText و متد Text با استفاده از خصوصیت

tPoetry.Text =

"In Xanadu did Kubla Khan\r\na stately pleasure dome decree,";

txtPoetry.AppendText("\r\nWhere Alph the sacred river ran");

است که از تغییر محتوای کادر متنی جلوگیری م ی کند . خصوصیت Readonly ،TextBox خصوصیت مهمی از

برای ماسک کردن کاراکترهای داخل کادر به کاراکترهای خاص (معمولاً یک کلمه عبور)تنظیم میشود. PasswordChar

کادرهای متنی و کاراکترهای بازگشت به سر سطر

را به یک پایگاه داده ذخیره م ی کنید، می خواهید مطمئن شوید هیچ کاراکتر خاص در آن TextBox زمانی که داد ه های یک

را AcceptsReturn ، نظری بیفکنید TextBox تعبیه نشده باش د (همانند کاراکتر برگشت به سر سط ر ). اگر به خصوصیات

توسط کاربر را نادیده م ی گیرد. با این Enter فشاردادن کلید TextBox ، قرار دهید False خواهید یافت . اگر مقدار آ ن را

فرم به یک دکمه روی AcceptsReturn وجود، نام این خصوصیت بعضی مواقع گمرا ه کننده است . فقط زمانی که خصوصیت

True کادر متنی MultiLine تنظیم نشده باشد (و خصوصیت AcceptsReturn فرم تنظیم شده باشد، کار م ی کند. اگر

یک خط جدید دریافت میکند. r\n) TextBox\) فشار داده شود Enter باشد)، زمانی که کلید

این عمل توسع ه دهنده را از کار اداره کردن بازگشت به سر سطر ناخواسته رها م ی کند. دو روش در دسترس اس ت : به محض

وارد کردن داده، ضرب ه های کلید را گرفته یا قبل از ذخیره کاراکترها در متن، آنها را استخراج کنی د . روش اول یک اداره

کننده رویداد صفحه کلید بکار میبرد.

// Set up event handler in constructor for TextBox txtPoetry

txtPoetry.KeyPress += new KeyPressEventHandler(onKeyPress);

private void onKeyPress( object sender, KeyPressEventArgs e)

{

if(e.KeyChar == (char)13) e.Handled = true;

}

به کادر متنی جلوگیری م ی شود. این عمل برای ورود از طریق صفحه r\n\ از اضافه شدن Handled به True با دادن مقدار

کردن جلوگیری Paste تأثیری ند ارد. برای برطرف کردن این مورد، از Paste و Cut کلید خوب کار م ی کند، اما در عملیات

کرده یا اینکه در یک مرحله بازرسی نهایی همه کاراکترهای بازگشت به سر سطر را با یک فضای خالی یا هر کاراکتر انتخاب

جایگزین کنید.

txtPoetry.Text = txtPoetry.Text.Replace(Environment.NewLine," ");

نکته: دو روش معمول برای وارد کردن یک کاراکتر برگشت به سر سطر وجود دارد:

txtPoetry.Text = "Line 1\r\nLine 2";

txtPoetry.Text = "Line 1"+Environment.NewLine+"Line 2";

mohsen_mahyar@yahoo.com

232

ComboBox و CheckedListBox،ListBox -4-15 کلاسهای

ListBox -1-4-15 کلاس

لیستی از اقلام فرا ه م می سازد، که ممکن است کاربر یک یا چند تا از آنها را انتخاب کن د . معمولاً اطلاعات ListBox کنترل

این لیست از نوع متنی اس ت . اما می تواند تصاویر و اشیایی را شامل شو د . ویژگیهای دیگر آن مدهایی برای جستجوی متنی،

کردن ظاهر پی ش فرض و override مرتبسازی، نمایش چند ستونی، نوارهای لغزنده افقی و عمودی و یک رو ش ساده برای

ایجاد عناصر لیست توسط خود کاربر را دربر دارد.

constructor: public ListBox()

Form.Load در سازند ه ی فرم ظرف یا اداره کننده رویداد ListBox خالی ایجاد م ی کند. کد ایجاد ListBox سازنده یک

بر اساس ترتیب صعودی ListBox قرار داده شود، اقلام True مقدار ListBox.Sorted قرار می گیرد. اگر خصوصیت

الفبایی مرتب م ی شوند. همچنین اگر اندازه کنترل برای نمایش همه اقلام کافی نباشد، بطور اتوماتیک نوارهای لغزنده عمودی

اضافه میشوند.

ListBox اضافه کردن اقلام به یک

به یک منبع داده ListBox دارد که همه اقلام لیست را در بر دار د . با مقید کردن Items یک کلکسیون بنام ListBox

باشد، False مقدار Sorted می توان عناصری به لیست اضافه کر د . اگر خصوصیت ،Add یا با استفاده از متد (ADO.NET)

برای قراردادن یک قلم داده در Insert اقلام به همان ترتیب که وارد م ی شوند لیست م ی شوند. همچنین یک متد بنام

موقعیت خاص وجود دارد.

lstArtists.Items.Add("Monet");

lstArtists.Items.Add("Rembrandt");

lstArtists.Items.Add("Manet");

lstArtists.Items.Insert(0, "Botticelli"); //Place at top

در زمان اضافه کردن یک قلم داده، متد ListBox توجه: برای جلوگیری از ترسیم مجدد

را بعد از اضافه کردن آخرین ListBox.EndUpdate را قبل از اضافه کردن و ListBox.BeginUpdate

قلم داده اجرا کنید.

همچنین امکان دارد کادرهای لیست اشیایی را شامل شوند، چون یک شی اعضای زیادی دارد، سؤال این است که چه چیز در

یک قلم داده را ToString نتایج حاصل از متد ListBox نمایش داده م ی شود. چون بطور پی ش فرض TextBox لیست

شده باش د . کلاس زیر برای ایجاد override برای هر قلم داده System.Object نشان می دهد، ضروری است این متد

استفاده میشود. ListBox اقلام

// Instances of this class will be placed in a ListBox

public class Artist

{

public string BDate, DDate, Country;

private string firstname;

private string lastname;

public Artist(string birth, string death, string fname,

string lname, string ctry)

{

BDate = birth;

DDate = death;

Country = ctry;

firstname = fname;

lastname = lname;

}

فصل پانزدهم کنترل های فرم ویندوز

233

public override string ToString()

{

return (lastname+" , "+firstname);

}

public string GetLName

{

get

{

return lastname;

}

}

public string GetFName

{

get

{

return firstname;

}

}

}

نمایش داده م ی شود . ListBox شده است، که در override برای برگرداندن نام و فامیل هنرمند ToString متد

9 با استفاده از این دستورات تولید شده است. - شکل 15 ListBox

lstArtists.Items.Add (new Artist("1832", "1883", "Edouard", "Manet","Fr" ));

lstArtists.Items.Add (new Artist("1840", "1926", "Claude", "Monet","Fr"));

lstArtists.Items.Add (new Artist("1606", "1669", "Von Rijn", "Rembrandt","Ne"));

lstArtists.Items.Add (new Artist("1445", "1510", "Sandre", "Botticelli","It"));

9- شکل 15

ListBox انتخاب و جستجوی اقلام در یک

در یک لحظه قابل انتخاب هستن د . آن چهار ListBox معین م ی کند چه تعداد قلم داده SelectionMode خصوصیت

.MultiExtended و MultiSingle ،Single ،None : را میگیرد SelectionMode مقدار از نوع شمارشی

کاربرد MultiExtended . انتخاب م ی کند SpaceBar بوسیله کلیک روی قلم داده یا فشار دادن MultiSingle مقدار

را مجاز میدارد. Ctrl و Shift کلیدهای

است . زمانی که کاربر ListBox یک راه ساده برای تشخیص انتخاب یک قلم داده از SelectedIndexChanged رویداد

روی یک قلم داده کلیک م ی کند یا کلیدهای جه ت نما را حرکت م ی دهد ، این رویداد ات فاق میافتد. کاربرد معمول آن نمایش

انتخاب ListBox اطلاعات دقیق در مورد عناصر موجود در کنتر ل های دیگر فرم اس ت . در کد زیر زمانی که یک هنرمند از

9 را ببینید. - میشود، تاریخ تولد و مرگ آن را نمایش میدهد. شکل 15

// Set up event handler in constructor

lstArtists.SelectedIndexChanged += new EventHandler(ShowArtist);

//

private void ShowArtist(object sender, EventArgs e)

{

// Cast to artist object in order to access properties

Artist myArtist = lstArtists.SelectedItem as Artist;

mohsen_mahyar@yahoo.com

234

if (myArtist != null) {

txtBirth.Text = myArtist.Dob; // Place dates in text boxes

txtDeath.Text = myArtist.Dod;

}

}

به as را بر م ی گرداند . این شی از طریق عملگر ListBox قلم داد ه ی انتخاب شده در SelectedItem خصوصیت

را SelectedIndex است . می توان خصوصیت Artist انتساب داده م ی شود تا مطمئن شود شی یک نوع myArtist

برای ارجاع به قلم داده انتخاب شده بکار برد.

myArtist = lstArtists.Items[lstArtists.SelectedIndex] as Artist;

چند انتخابی یک روش مختلفی لازم است. معمولاً تا زمانی که همه اقلام داده انتخاب نشد ه اند، ListBox برای کار با یک

نمیخواهید به رویداد انتخاب پاسخ ده د . یک روش کلیک روی یک دکمه توسط کاربر است تا خبر دهد همه انتخا ب ها انجام

قرار م ی گیرند، پس یافتن آنها توسط SelectedItem شده و عمل بعدی نیاز اس ت . همه انتخاب ها در بخشی از کلکسیون

یک شمارنده راحت است.

foreach (Artist a in lstArtists.SelectedItems)

MessageBox.Show(a.GetLName);

برای انتخاب یک یا چند قلم د اده از طریق برنامهنویسی بکار میرود. آن متد قلم داد ه ها را انتخاب SetSelected متد

برای انتخاب همه هنرمندان SetSelected ، را رها م ی سازد. در این مثال SelectedIndexChanged کرده و رویداد

متولد فرانسه استفاده میشود.

for (int ndx =0; ndx < lstArtists.Items.Count-1; ndx ++)

{

Artist a = lstArtists.Items[ndx] as Artist;

if (a.country == "Fr") lstArtists.SetSelected(ndx,true);

}

ListBox سفارشیکردن ظاهر یک

شکل ترسیم خاص خود را دار د . بدین معنی که با TabControl و MenuItem ،ComboBox به همراه کنتر ل های ListBox

مقداردهی خصوصیات یک کنترل، میتوانید از آن بخواهید، زمانی که لازم است محتویات کنترل مجدداً رسم شود، یک

رویداد آزاد سازد. یک اداره کننده سفارشی رویداد، ترسیم واقعی را فراهم میسازد.

قرار DrawMode آن باید یکی از مقادیر نوع شمارشی DrawMode خصوصیت ،ListBox برای فعال کردن ترسیم خودکار

اولی هر قلم داده را با یک اندازه ثابت رسم م ی کند. دومی قلم .OwnerDrawVariable یا OwnerDrawFixed : داده شود

رها شود و به عمل ترسیم توسط DrawItem دادههایی با اندازه متغیر را مجاز م ی دارد. هر دو مورد باعث م ی شوند، رویداد

اداره کننده رویداد تکیه دارد.

را مقداردهی کرده و یک اداره کننده رویداد DrawMode مثال قبلی، در سازند ه ی فرم، خصوصیت ListBox با استفاده از

ثبت میکنیم. DrawItem برای رویداد

lstArtists.DrawMode = DrawMode.OwnerDrawFixed;

lstArtists.ItemHeight = 16; // Height (pixels) of item

lstArtists.DrawItem += new DrawItemEventHandler(DrawList);

پارامتر دومی جال ب تر .DrawItemEventArgs و شی Sender دو پارامتر دار د : شی DrawItemEventHandler نماینده

2 خلاصهای از آنهاست. - است و خصوصیاتی در ارتباط با ظاهر و حالت کنترل دارد. جدول 15

2- جدول 15

فصل پانزدهم کنترل های فرم ویندوز

235

عضو توصیف

رنگ پس زمینه انتساب داده شده به کنترل است. BackColor

رسم Rectangle مختصات قلم داده را تعریف م ی کند تا بصورت یک شی Bounds

شود

فونت انتساب داده شده به کنترل است. Font

رنگ متن نمایش داده شده روی کنترل ForeColor

ارائه م ی کند، تا ترسیم روی آن Graphics سطح کنترل را به صورت یک شی Graphics

رخ دهد.

اندیس قلم داده که رسم میشود. Index

حالت قلم دادهای که رسم می شود. مقدار آن از نوع شمارشی State

1)یا ( 0) را دارد. Selected ( مقادیر ListBox است. در DrawItemState

پس زمینه پیشفرض را رسم میکند. DrawBackground()

مستطیل کانون را دور قلم دادهای که کانون را دارد، رسم میکند. DrawFocusRectangle()

تنظمات هر کدام را بر ForeColor و BackColor ،Font . برای یافتن موقعیت یک قلم داده استفاده م ی شود Index

برای State . یک ناحیه مستطیلی را تعریف م ی کند که عمل ترسیم ق لم داده ی جدید در آنجا رخ ده د Bounds . میگردانند

انتخاب چندگانه را پشتیبانی ListBox مشخصکردن حالت انتخاب قلم داده در زمان ترسیم مفید است، مخصوصاً زمانی که

میکند.

3 نشان داده م ی شود. رفتار آن بوسیل ه عملی که انجام - در مثال 15 ListBox اداره کننده رویداد برای ترسیم اقلام داد ه ای

میشود، تعیین م ی گردد. اگر قلم داد ه ای انتخاب نشده باشد، یک حاشیه سیاه در پشت زمینه برای انتخاب آن رسم م ی شود.

اگر یک قلم داد ه ای اضافه شود، پس زمینه با رنگی متناسب با کشور هنرمند پر م ی شود و نام و فامیل هنرمند نمایش داده

میشود.

لازم اس ت . با این وجود، هدف متدها از نام و محتوای آنها واضح اس ت . +GDI در این پر و سه دانشی درباره مفاهیم

با استفاده از DrawString را پر م ی کند و Rectangle یک ناحیه مستطیلی تعریف شده بوسیله شی FillRectangle

خروجی را نشان B9- رسم م یکند . شکل 15 Graphics متنی را روی شی ،Brush رنگ فونت تعریف شده توسط شی

میدهد.

3- مثال 15

private void DrawList(object sender, DrawItemEventArgs e)

{

// Draw ListBox Items

string ctry;

Rectangle rect = e.Bounds;

Artist a = lstArtists.Items[e.Index] as Artist;

string artistName = a.ToString();

if ( (e.State & DrawItemState.Selected) ==DrawItemState.Selected )

{

// Draw Black border around the selected item

mohsen_mahyar@yahoo.com

236

e.Graphics.DrawRectangle(Pens.Black,rect);

} else {

ctry = a.Country;

Brush b; // Object used to define backcolor

// Each country will have a different backcolor

b = Brushes.LightYellow; // Netherlands

if (ctry == “Fr”) b = Brushes.LightGreen;

if (ctry == “It”) b = Brushes.Yellow;

e.Graphics.FillRectangle(b,rect);}

e.Graphics.DrawString(artistName,e.Font, Brushes.Black,rect);

}

}

CheckedListBox و ComboBox : -2-4-15 کنترلهای دیگری از لیست

از listBox 10 را ببینی د ). شبیه - اس ت . (شکل 15 TextBox و ListBox یک کنترل ترکیبی از ComboBox کنترل

مشتق میشود و بیشتر خصوصیات آن را متصرف میشود. ListControl

10- شکل 15

در دسترس است و یک Text یک کادر متنی دارد که محتوای آن از طریق خصوصیت ComboBox از نظر ظاهری، کنترل

در دسترس اس ت . زمانی که یک قلم داده انتخاب SelectedItem لیست بازشو که قلم داد ه ی انتخابی از طریق خصوصیت

در ایجاد سؤالاتی که کاربر یکی از اقلام داده را انتخاب ComboBox . میشود، متن آن در کادر متنی نمایش داده م ی شود

است. ListBox میکند یا جواب را تایپ میکند مفید است. ساختار آن شبیه

ComboBox cbArtists = new ComboBox();

cbArtists.Size = new System.Drawing.Size(120, 21);

cbArtists.MaxDropDownItems= 4; // Max number of items to display

cbArtists.DropDownWidth = 140; // Width of drop-down portion

cbArtists.Items.Add(new Artist("1832", "1883","Edouard", "Manet","Fr" ));

// Add other items here...

است که یک کادر انتخاب برای هر قلم داده در لیست اضافه ListBox حالت تغییر یافت ه ای از کنترل CheckedListBox

میکند. رفتار پیش فرض این کنترل، انتخاب یک قلم داده با اولین کلیک است و با کلیک دوم قلم داد ه ی انتخاب شده از

انتخاب خارج میشود.

قرار دهی د . True را CheckOnClick برای اینکه با یک کلیک، قلم داده انتخاب شده یا از انتخاب خارج شود، خصوصیت

اجازه م ی دهد چندین قلم داده انتخاب شوند و آنها در CheckedListBox ، اگرچه آن انتخاب چندگانه را پشتیبانی نم ی کند

قرار میگیرند. CheckedItems یک کلکسیون

را بررسی میکند که قلم دادههای انتخاب شده روی کنترل را در بر دارد. Artist قطعه کد زیر، کلکسیون اشیاء

// List all items with checked box.

foreach (Artist a in clBox.CheckedItems)

MessageBox.Show(a.ToString()); // –> Monet, Claude

میتوانید سراسر کلکسیون را طی کرده و حالت انتخاب قلم دادهها را صریحاً معین کنید.

فصل پانزدهم کنترل های فرم ویندوز

237

for (int i=0; I< clBox.Items.Count; i++)

{

if(clBox.GetItemCheckState(i) == CheckState.Checked)

{

Do something

} else

{

do something if not checked

}

ListView و TreeView -5-15 کلاسهای

ListView -1-5-15 کلاس

کنترل دیگری است که لیستی از اطلاعات را نمایش م ی دهد. این کنترل داد ه ها را بصورت رابط ه ای همچون قل  م ListView

دادهها و زیر قلم داد ه ها ارائه م ی کند. به روش های متعددی م ی توان داده ها را نمایش دا د . شبکهی چند ستونی با آیکو ن های

کوچک یا بزرگ برای نمایش قلم دادهها استفاده میشوند. همچنین تصاویر و کادرهای انتخاب کنترل را زینت میدهد.

11 خصوصیات و متدهای ا س اسی استفاده شده برای طر ح بندی یک نمای دقیق کنترل را ارائه م ی کند. ستون اول به - شکل 15

همراه یک عکس، متن یک قلم داده را در بر دارد. مابقی ستونها، زیر قلم دادههای قلم دادهی پدر را در بر دارند.

11- شکل 15

را بررسی کنیم. ListView اجازه دهید نحوه ایجاد این سبک از

ListView ایجاد یک شی

بوسیلهی یک سازنده بدون پارامتر ایجاد میشود. ListView

ListView listView1 = new ListView();

ListView تعریف ظاهر شئ

// Set the view to show details

listView1.View = View.Details;

یکی از 5 طرحبندی را برای کنترل مشخص میکند. View خصوصیت

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

238

در ستون اول یک آیکون و یک متن نمایش داده م ی شود. زیر قلم داد ه ها در ستو ن های مابقی نمایش داده :Details

میشوند.

برای هر قلم داده یک آیکون بزرگ و یک برچسب در زیر آن نشان میدهد. :LargeIcon

هر قلم داده بصورت یک آیکون کوچک و برچسبی در سمت راست آن نمایش داده م ی شود . آیکون ها در میان :List

ستونهای کنترل مرتب میشوند.

هر قلم داده در یک ستون بصورت یک آیکون کوچک برچسبی در سمت راست آن ظاهر میگردد. :SmallIcon

هر قلم داده بصورت یک آیکون با اندازه طبیعی ظاهر م ی گردد که برچسب و جزئیات آن در سمت راست ظاه ر :Tile

و 2003 موجود است. WinXP میگردد. فقط در

در زمان اجرا قابل تغییر م ی باشد و م ی توانید مابین نماهای ممکن ListView.View توجه: خصوصیت

سوئیچ کنید.

انتخاب م ی شود، خصوصیات دیگری که ظاهر و رفتار کنترل را تعریف م ی کنند، مقداردهی Details بعد از اینکه نمای

میشوند.

// Allow the user to rearrange columns

listView1.AllowColumnReorder = true;

// Select the entire row when selection is made

listView1.FullRowSelect = true;

// Display grid lines

listView1.GridLines = true;

// Sort the items in the list in ascending order

listView1.Sorting = SortOrder.Ascending;

این خصوصیات بطور اتوماتیک قلم داد ه ها را مرتب م ی سازند، به کاربر اجازه م ی دهند ستونها را بکشند و زمانی که یک قلم

داده انتخاب میشود، کل سطر انتخاب میگردد.

تنظیم سرآیندهای ستون

تا زمانی که حداقل یک ستون به کنترل اضافه نشود، داد ه های نما ی ش داده نم ی شوند . بوسیله متد ،Details در نمای

ستونها را اضافه کنید. ساده ترین شکل بصورت زیر است: Columns.Add

ListView.Columns.Add(caption, width, textAlign)

تعداد پیکس ل های عرض ستون را مشخص م ی کند. در صورتی که - 1 Width . متنی است که نمایش داده م ی شود Caption

باشد، اندازه س ت ون بطور اتوماتیک متناسب با بزرگترین قلم داده تغییر م ی یابد و اگر - 2 باشد، با عرض سرآیند هم اندازه

میشود.

// Create column headers for the items and subitems

listView1.Columns.Add("Artist", -2, HorizontalAlignment.Left);

listView1.Columns.Add("Born", -2, HorizontalAlignment.Left);

listView1.Columns.Add("Died", -2, HorizontalAlignment.Left);

listView1.Columns.Add("Country", -2, HorizontalAlignment.Left);

اضافه م ی کند. این متد ListView کنترل Column ایجاد کرده و به کلکسیون ColumnHeader یک نوع داده Add متد

را مستقیماً به عنوان پارامتر میگیرد. ColumnHeader دارد که شی overload یک

ColumnHeader cHeader:

cHeader.Text = "Artist";

cHeader.Width = -2;

فصل پانزدهم کنترل های فرم ویندوز

239

cHeader.TextAlign = HorizontalAlignment.Left;

ListView.Columns.Add(ColumnHeader cHeader);

ListView ایجاد قلم دادههای

دارد . آنها می توانند برای ایجاد یک قلم داده واحد یا یک قلم داد ه ی واحد overload چندین ListView سازندهی کلاس

و زیرقلم داده های آن استفاده شوند. آنها گزینههایی برای تعیین آیکون قلم داده و رنگ نوشته و پس زمینه دارند.

سازندهها

public ListViewItem(string text);

public ListViewItem(string[] items );

public ListViewItem(string text,int imageIndex );

public ListViewItem(string[] items,int imageIndex );

public ListViewItem(string[] items,int imageIndex,

Color foreColor,Color backColor,Font font);

8 ارائه میکند. - های مختلف را در ایجاد قلم دادهها و زیر قلم دادههای شکل 15 overload قطعه کد زیر، نحوه استفاده از

// Create item and three subitems

ListViewItem item1 = new ListViewItem("Manet",2);

item1.SubItems.Add("1832");

item1.SubItems.Add("1883");

item1.SubItems.Add("France");

// Create item and subitems using a constructor only

ListViewItem item2 = new ListViewItem (new string[]

{"Monet","1840","1926","France"}, 3);

// Create item and subitems with blue background color

ListViewItem item3 = new ListViewItem

(new string[] {"Cezanne","1839","1906","France"}, 1,Color.Empty,

Color.LightBlue, null);

اضافه کنید. ListView کنترل Items برای نمایش قلم دادهها، آنها را به کلکسیون

// Add the items to the ListView

listView1.Items.AddRange(new ListViewItem[]{item1,item2,item3,item4,item5});

تعیین آیکونها

تصاویری را برای استفاده در نمای ،LargeImageList : اختصاص دا د ListView میتوان دو کلکسیون از تصاویر به

تصاویری برای استفاده در نماهای دیگر دار د . تصور کنید آنها آرای ه هایی از ، SmallImageList در بر دارد و LargeIcon

یک قلم داده اختصاص داده م ی شود. اگرچه ListViewItem در سازنده imageIndex تصاویر هستند که بوسیله پارامتر

آنها بصورت آیکونهایی بیان میشوند، ولی ممکن است تصاویری از هر قالب گرافیکی استاندارد باشند.

ایجاد م ی کند، تصاویری به آنها اضافه م ی کند، و آنها را به خصوصیات ImageList قطعه کد زیر دو شی

انتساب میدهد. SmallImageList و LargeImageList

// Create two ImageList objects

ImageList imageListSmall = new ImageList();

ImageList imageListLarge = new ImageList();

imageListLarge.ImageSize = new Size(50،50); // Set image size

// Initialize the ImageList objects

// Can use same images in both collections since they're resized

imageListSmall.Images.Add(Bitmap.FromFile("C:\\botti.gif"));

imageListSmall.Images.Add(Bitmap.FromFile("C:\\cezanne.gif"));

imageListLarge.Images.Add(Bitmap.FromFile("C:\\botti.gif"));

imageListLarge.Images.Add(Bitmap.FromFile("C:\\cezanne.gif"));

// Add other images here

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

240

// Assign the ImageList objects to the ListView.

listView1.LargeImageList = imageListLarge;

listView1.SmallImageList = imageListSmall;

ListViewItem lvItem1 = new ListViewItem("Cezanne",1);

ImageList را به عنو ان آیکون های کوچک و بزرگ انتخاب م ی کند. تعیین اندیسی که در cezanne.gif اندیس 1 تصاویر

تعریف نشده باشد، هیچ آیکونی نمایش داده نم ی شود. شکل ImageList نباشد، آیکون اندیس صفر را در نظر م ی گیرد. اگر

نشان میدهد. View.LargeIcon 11 را با نمای - شکل 15 ListView ،12-15

listView1.View = View.LargeIcon;

12- شکل 15

ListView کار با کنترل

طی کردن همه محتویات کنترل، طی کردن فقط قلم داد ه های ،ListView کارهای معمول اختصاص داده شده به کنترل

انتخاب شده، تشخیص قلم داد ه ای که کانون را دارد، مرت ب سازی قلم داد ه ها بوسیله هر ستونی اس ت . در زیر قطع ه کدهایی

برای انجام این کارها آمده است.

طیکردن همه قلم دادهها یا قلم دادههای انتخاب شده

را برای ایجاد حلق ه های تو در تو بکار برید، که یک قلم داده را انتخاب کند و سپس همه زیر قل م دادههای foreach میتوانید

قلم دادهی حلقه بیرونی را طی میکند.

foreach (ListViewItem lvi in listView1.Items)

{

string row = "";

foreach(ListViewItem.ListViewSubItem sub in lvi.SubItems)

{

row += " " + sub.Text;

}

MessageBox.Show(row); // List concatenated subitems

}

در هنگام کار با این کلکسیون، باید از چند چیز با خبر باشی د . اولاً، زیر قلم داده اول (اندیس صفر) در واقع متن قلم داده را

تحت تأثیر قرار نم ی گیرد. ListView در بر دارد و زیر قلم داده نیس ت . ثانیاً، زیر قلم داد ه ها با مرتب کردن ستو ن های کنترل

این عمل ظاهر را تغییر میدهد، اما ترتیب اصلی زیر قلم دادهها را تحت تأثیر قرار نمی دهد.

همان منطق برای لیست کردن فقط قلم داد ه های انتخاب شده استفاده م ی شود. تنها تفاوت این است که ط ی کردن لیست

رخ میدهد. ListView.SelectedItems روی کلکسیون

foreach (ListViewItem lvisel in listView1.SelectedItems)

فصل پانزدهم کنترل های فرم ویندوز

241

تشخیص قلم داده انتخاب شده جاری

رویداد دیگری بنا م ListView کنترل ،DoubleClick و Click علاوه ب ر رویدادهای اصلی همچون

دارد که زمان انتقال کانون از یک قلم داده به دیگری رخ م ی دهد. قطعه کد زیر در یک اداره SelectedIndexChanged

را برای تعیین قلم دادهی جاری بکار میبرد. FocusedItem کننده رویداد، خصوصیت

// Set this in the constructor

listView1.SelectedIndexChanged +=new EventHandler(lv_IndexChanged);

// Handle SelectedIndexChanged Event

private void lv_IndexChanged(object sender, System.EventArgs e)

{

string ItemText = listView1.FocusedItem.Text;

}

را بکار م ی برند . EventHandler نیز بکار برد، چون آنها نیز نماینده Click توجه کنید که م ی توان این کد را در رویداد

برای تشخیص قلم داده جاری استفاده م ی شوند. این نمون ه ای از یک اداره کننده MouseUp و MouseDown رویدادهای

است. MouseDown رویداد

private void listView1_MouseDown(object sender, MouseEventArgs e)

{

ListViewItem selection = listView1.GetItemAt(e.X, e.Y);

if (selection != null)

{

MessageBox.Show("Item Selected: "+selection.Text);

}

}

قلم داد ه ی موجود در محلی که دکمه ماوس فشار داده م یشود، را بر م ی گرداند. اگر ماوس ListView.GetItemAt متد

برگردانده میشود. null ، روی قلم دادهای نباشد

ListView مرتبسازی قلم دادههای یک کنترل

بوسیله مقادیر ستو ن ها، یک ویژگی ساده آن جهت پیاد ه سازی است . راز سادگی ListView مرتبسازی قلم داد ه های یک

است، که یک شی را برای مرت ب کردن قلم داد ه ها در زمان فراخوانی متد ListViewItemSorter آن خصوصیت

مشخص میکند. پیادهسازی در سه مرحله انجام میشود. ListView.Sort

به یک اداره کننده رویداد برقرار کنید. ColumnClick -1 یک نماینده برای متصل کردن رویداد

را یک نمونه از کلاس قرار دهید ListViewItemSorter -2 یک متد اداره کنند ه ی رویداد ایجاد کنید که خصوصیت

که عملیات مقایسه را در مرتبسازی انجام میدهد.

را وراثت کند و متد IComparer -3 یک کلاس برای مقایس ه کردن مقاویر ستو ن ها ایجاد کنی د . آن باید واسط

را پیادهسازی کند. IComparer.Compare

کد زیر منطق را پیاد ه سازی می کند. زمانی که یک ستون کلیک م ی شود، اداره کننده رویداد یک نمونه از کلاس

را بسیله ارسال ستون کلیک شده ایجاد م ی کند. این شی به خصوصیت ListViewItemComparer

انتساب داده میشود که منجر به مرتبسازی میشود. ListViewItemSorter

// Connect the ColumnClick event to its event handler

listView1.ColumnClick +=new ColumnClickEventHandler(ColumnClick);

// ColumnClick event handler

private void ColumnClick(object o, ColumnClickEventArgs e)

{

// Setting this property immediately sorts the

// ListView using the ListViewItemComparer object

mohsen_mahyar@yahoo.com

242

this.listView1.ListViewItemSorter =new ListViewItemComparer(e.Column);

}

// Class to implement the sorting of items by columns

class ListViewItemComparer : IComparer

{

private int col;

public ListViewItemComparer()

{

col = 0; // Use as default column

}

public ListViewItemComparer(int column)

{

col = column;

}

// Implement IComparer.Compare method

public int Compare(object x, object y)

{

string xText = ((ListViewItem)x).SubItems[col].Text;

string yText = ((ListViewItem)y).SubItems[col].Text;

return String.Compare(xText, yText);

}

}

TreeView -2-5-15 کلاس

یک نمای درخ ت گونه از داد ه های سلسله مراتبی به عنوان واسط کاربر TreeView همانطور که از اسمش پیداست، کنترل

فراهم می سازد. مدل برنامه نویسی آن مبتنی بر ساختار درخت شامل گر ه های پدر و فرزند اس ت . هر گره بصورت یک شی

را TreeView 13 یک کنترل - خود را داشته باش د . شکل 15 Nodes پیاده سازی می شود و م ی تواند کلکسیون TreeNode

جهت نمایش اعضای شمارشی یک اسمبلی انتخاب شده بکار م یرود. ListView نشان می دهد، که در ارتباط با یک

13- شکل 15

TreeNode کلاس

Tag ،Text نمای ش داده م ی شود. با استفاده از خصوصیات TreeNode هر قلم داده در یک درخت بوسیله یک نمونه از کلاس

برچسب گره را نگه م ی دارد، که در کنترل Text داده ها به هر گروه اختصاص داده م ی شود. خصوصیت ،ImageIndex یا

است، که م ی توانیم هر شی سفارشی را به آن انتساب دهی م . object یک نوع داده Tag . نشان داده نم ی شود TreeView

است . آن تصویر یک گره را مشخص TreeView انتساب داده شده به کنترل ImageList اندیسی از یک ImageIndex

می کند.

اعضای متعدد دیگری فراهم م ی سازد، که برای اضافه کردن گر ه ها، تغییر TreeNode علاوه بر این خصوصیات اصلی، کلاس

3 را ببینید). - ظاهر یک گره، هدایت گره ها در یک گره بکار می روند(جدول 15

فصل پانزدهم کنترل های فرم ویندوز

243

3- جدول 15

کاربرد عضو توصیف

BackColor, ظاهر

رنگ متن و پس زمینه گره را قرار می ForeColor دهد.

Expand(),

Collapse() گره را برای نمایش فرزندانش باز م ی کند یا برای پنهان کردن

فرزندان گره را م یبندد.

FirstNode, هدایت

LastNode,

NextNode,

PrevNode

اولین یا آخرین گره کلکسیون را بر م ی گرداند. گره قبلی یا بعدی

مرتبط با گره جاری را بر م یگرداند.

اندیس گره جاری در کلکسیون است. Index

پدر گره جاری را بر م یگرداند. Parent

دستکاری

گره

Nodes.Add(),

Nodes.Remove(),

Nodes.Insert(),

Nodes.Clear()

Insert . اضافه یا حذف م ی کند Nodes یک گره به کلکسیون

یک گره به یک موقعیت با اندیس مشخص اضافه م ی کند و متد

همه گره های درخت را از کلکسیون پاک م یکند. Clear

یک گره و کل زیر درخت آن را کپی م یکند. Clone()

استفاده می شوند. TreeView برای انجام عملیات پایه ای TreeNode و TreeView حال بررسی می کنیم چگونه اعضای

اضافه کردن و حذ فکردن گره ها

14 را ایجاد م ی کند . متدها روی کنترل - درخت شکل 15 Clone و Insert ،Add کد زیر با استفاده از ترکیب متدهای

1 موجود انجام می شوند. TreeView

TreeNode tNode;

// Add parent node to treeView1 control

tNode = treeView1.Nodes.Add("A");

// Add child node: two overloads available

tNode.Nodes.Add(new TreeNode("C"));

tNode.Nodes.Add("D"));

// Insert node after C

tNode.Nodes.Insert(1,new TreeNode("E"));

// Add parent node to treeView1 control

tNode = treeView1.Nodes.Add("B");

14- شکل 15

اضافه کنی م . این عمل با کپی کامل زیر درخت B و زیر درختش را به گره پدر A در این نقطه، هنوز نیاز داریم یک کپی از گره

0] ارجاع داده م ی شود، چون آن اولین گره .Nodes[1treeView با A انجام م ی شود. گره B و اضاف ه کردن آن به گره A

mohsen_mahyar@yahoo.com

244

گره ها را به یک کلکسیون الحاق م ی کند. آنها م ی توانند بوسیله اندیس Add کلکسیون کنترل اس ت . توجه ک نید که متد

موقعیت در کلکسیون ارجاع داده شوند.

// Clone first parent node and add to node B

TreeNode clNode = (TreeNode) treeView1.Nodes[0].Clone();

tNode.Nodes.Add(clNode);

// Add and remove node for demonstration purposes

tNode.Nodes.Add("G");

tNode.Nodes.Remove(tNode.LastNode);

TreeView طی کردن همه گره ها در یک

ساده ترین راه برای طی کردن اعضای کلکسیون فراهم م ی کند. دستورات زیر همه foreach همانند هر کلکسیونی، دستور

گره های سطح بالای یک کنترل را نشان م یدهند.

foreach (TreeNode tn in treeView1.Nodes)

{

MessageBox.Show(tn.Text);

// If (tn.IsVisible) true if node is visible

// If (tn.IsSelected) true if node is currently selected

}

است. treeNode.NextNode روش دیگر طی کردن کلکسیون از طریق خصوصیت

tNode = treeView1.Nodes[0];

while (tNode != null) {

MessageBox.Show(tNode.Text);

tNode = tNode.NextNode;

}

تشخیص گره انتخاب شده

رها م یسازد که یک پارامتر AfterSelect یک رویداد TreeView زمان انتخاب یک گره، کنترل

به کد اداره کننده روی د اد ارسال م ی کند. این پارامتر عملی که باعث انتخاب گره شده و گره انتخاب TReeViewEventArgs

را اداره MouseDown زیر نحوه اداره این رویداد را نشان م ی دهد. می توانید رویداد TreeView شده را معین م ی کند. مثال

گره را تشخیص دهید که گره موجود در مختصات جاری ماوس را بر می گرداند. GetNodeAt کرده و با استفاده از متد

private void treeView1_MouseDown(object sender, MouseEventArgs e)

{

TreeNode tn = treeView1.GetNodeAt(e.X, e.Y);

// You might want to remove the node: tn.Remove()

}

با کاربرد انعکاس TreeView یک مثال

برای نمایش انواع شمارشی یک TreeView 13 ) که یک - این مثال نحوه ایجاد یک کا و شگر ساده را نشان م ی دهد(شکل 15

اسمبلی خاص را بکار م ی برد. زمانی که یک گره روی درخت کلیک م ی شود، اعضای نوع شمارشی انتخاب شده در یک کنترل

نمایش داده می شود. ListView

کلاس هایی برای System.Reflection در فضای نامی NET. اطلاعات یک اسمبلی در فرا داد ه ی آن ذخیره م ی شود و

ایجاد TreeView 4 انواع داد ه ای یک اسمبلی را طی م ی کند تا یک - بدست آوردن این فراداد ه ها فراهم م ی سازد. مثال 15

کند. گره های پدر اسامی فضاهای نامی منحصر به فرد را دارند و گر ه های فرزند انواع داد ه ای داخل فضای یک اسمبلی را طی

ایجاد کن د . گره های پدر اسامی فضاهای نامی منحصر به فرد را دارند و گر ه های فرزند انواع داد ه ای TreeView می کند تا یک

داخل فضاهای نامی را در بردارند.

فصل پانزدهم کنترل های فرم ویندوز

245

ارث بری system.Enum را در بر گیرد، یک بررسی انجام م ی شود تا مطمئن گردد نوع داده از enum برای اینکه فقط انواع

می کند.

using System.Reflection;

//

private void GetEnums()

{

TreeNode tNode=null;

Assembly refAssembly ;

Hashtable ht= new Hashtable(); // Keep track of namespaces

string assem = AssemName.Text; // Textbox with assembly name

tvEnum.Nodes.Clear(); // Remove all nodes from tree

// Load assembly to be probed

refAssembly = Assembly.Load(assem);

foreach (Type t in refAssembly.GetTypes())

{

// Get only types that inherit from System.Enum

if(t.BaseType!=null && t.BaseType.FullName=="System.Enum")

{

string myEnum = t.FullName;

string nSpace =

myEnum.Substring(0,myEnum.LastIndexOf("."));

myEnum= myEnum.Substring(myEnum.LastIndexOf(".")+1) ;

// Determine if namespace in hashtable

if( ht.Contains(nSpace))

{

// Find parent node representing this namespace

foreach (TreeNode tp in tvEnum.Nodes)

{

if(tp.Text == myEnum) { tNode=tp; break;}

}

}

else

{

// Add parent node to display namespace

tNode = tvEnum.Nodes.Add(nSpace);

ht.Add(nSpace,nSpace);

}

// Add Child - name of enumeration

TreeNode cNode = new TreeNode();

cNode.Text= myEnum;

cNode.Tag = t; // Contains specific enumeration

tNode.Nodes.Add(cNode);

}

}

}

استفاده Assembly برای ایجاد یک نوع داده Assembly.Load توجه کنید انعکاس چگونه استفاده م ی شود. متد ایستای

شامل همه انواع داده ای طراحی شده در اسمبلی برم یگرداند. Type یک آرایه Assembly.GetTypes می شود. متد

refAssembly = Assembly.Load(assem);

foreach (Type t in refAssembly.GetTypes())

و enum نام نوع داده را بر م ی گرداند که فضای نامی را نیز شامل اس ت . این برای استخراج نام Type.FullName خصوصیت

enum از گر ههای فرزند ذخیره م یشود و بعداً برای بازیابی اعضای Tag در فیلد Type . نام فضای نامی استفاده م ی شود

استفاده می شود.

ساخته شد، نمایش اعضای یک نوع شمارشی هنگام کلیک بر روی گره کار نهایی آن م ی باشد . لازم TreeView بعد از اینکه

اعلام گردد. AfterSelect است یک اداره کننده رویداد ثبت شود تا در زمان رخ دادن رویداد

tvEnum.AfterSelect += new

TreeViewEventHandler(tvEnum_AfterSelect);

mohsen_mahyar@yahoo.com

246

Tag گره انتخاب شده را معین م ی کند . آن فیلد ،treeViewEventArgs.Node اداره کننده رویداد از طریق خصوصیت

را برای بازیابی اعضای نوع داده بصورت انواع داده GetMembers قالب بندی می کند و متد Type گره را به یک کلاس

ListView در اختیار قرار م ی گیرد که در MemberInfo.Name بکار م ی برد. نام هر عضو با خ ص وصیت MemberInfo

نمایش داده می شود.

// ListView lView;

// lView.View = View.List;

private void tvEnum_AfterSelect(Object sender,TreeViewEventArgs e)

{

TreeNode tn = e.Node; // Node selected

ListViewItem lvItem;

if(tn.Parent !=null) // Exclude parent nodes

{

lView.Items.Clear(); // Clear ListView before adding items

Type cNode = (Type) tn.Tag;

// Use Reflection to iterate members in a Type

foreach (MemberInfo mi in cNode.GetMembers())

{

if(mi.MemberType==MemberTypes.Field &&mi.Name != "value__" )

// skip this

{

lView.Items.Add(mi.Name);

}

}

}

}

StatusStrip و Timer،ProgressBar -6-15 کلاس های

یک Timer . کنترل های سبک وزنی هستند که نق ش های مکمل در یک برنامه کاربردی دارن د Timer و ProgressBar

یک کنترل Timer حالت یک عمل یا عملکرد آن را منعکس م ی کند. در حقیقت ProgressBar عملی را آغاز م ی کند و

ارث بری می کند. آن اغلب اوقات در پروس ه ها ComponentModel.Component نیست، اما یک قط ع ه ای است که از کلاس

برای تنظیم برخی فعالیت پش ت زمینه استفاده می شود . آن فعالیت ممکن است بروزآوری دور ه ای یک فایل یا یک

ی ک بازخورد بصری از پیشرفت یک عمل را ProgressBar ، پشتیبان گیری زمان بندی شده از داد ه ها باشد . از طرف دیگر

فراهم می کند (همچون کپی کردن فایل یا مراحل یک نصب).

استفاده ProgressBar و Timer است که اغلب در ارتباط با یک StatusStrip سومین کلاس بحث شده در این بخش

می شود. آن کنترل در روی فرم شبیه نواری است که به یک یا چند بخش تقسیم م ی شود یا تک ه هایی که اطلاعات حالت را

اضافه م ی شوند . برای StatusStrip فراهم می سازند. هر بخش بصورت یک کنترل پیاد ه سازی می شود، که در یک ظرف

ارث بری کرده باشد. ToolStripItem قرار گیرد، باید از کلاس StatusStrip اینکه یک کنترل در

فصل پانزدهم کنترل های فرم ویندوز

247

StatusStrip ایجاد یک

15 نشان داده شده - چند تکه ایجاد کنی م . همانطور که در شکل 15 StatusStrip حال اجازه دهید یک فرم شامل یک

اطلاعات (ToolStripLabel ) است، نوار پایین فرم یک برچسب، میله پیشرفت و کنتر ل های پانل را شامل اس ت . برچسب

ToolStripProgressBar متنی برای تشریح حالت کلی برنامه کاربردی فراهم م ی سازد. میله پ یشرفت بصورت یک شی

ارث بری م ی کند . یک ToolStripItem است، اما از ProgressBar پیاده سازی م ی شود. آن از نظر عمل شبیه

وقت سپری شده از زمان نمایش فرم را نشان م ی دهد. یک اداره کننده رویداد بوسیله زما ن سنج StatusStripPanel

کنترل می شود تا در هر 5 ثانیه میله پیشرفت و پانل ساعت را بهنگام سازد.

15- شکل 15

را در بر دار د . سرهای چپ و راست میله پیشرفت به ترتیب مقادیر 0 و 120 را نمایش StatusStrip 5 کد تولید - مثال 15

اجرا م ی شود، در هر مرحله به اندازه 10 واحد میله رشد می کند. در هر دقیقه تکرار PerformStep می دهند. زمانی که متد

می شود.

آن مقداری قرار داده Interval کنترل م ی کند چه زمانی میله رشد کند و وقت سپری شده بروز شو د . خصوصیت Timer

را کنترل م ی کند. در این مثال، در هر 5 ثانیه رویداد رها م ی شود، که میل ه ی Tick می شود، که فرکانس رهایی رویداد

پیشرفت 10 واحد رشد م یکند و وقت به اندازه 5 ثانیه سپری می شود.

5- مثال 15

// These variables have class scope

Timer currTimer;

StatusStrip statusStrip1;

StatusStripPanel panel1;

ToolStripProgressBar pb;

DateTime startDate = DateTime.Now;

private void BuildStrip()

{

currTimer = new Timer();

currTimer.Enabled = true;

currTimer.Interval = 5000; // Fire tick event every 5 seconds

currTimer.Tick += new EventHandler(timer_Tick);

// Panel to contain elapsed time

panel1 = new StatusStripPanel();

panel1.BorderStyle = Border3DStyle.Sunken;

panel1.Text = "00:00:00";

panel1.Padding = new Padding(2);

panel1.Name = "clock";

panel1.Alignment = ToolStripItemAlignment.Tail; //Right align

// Label to display application status

ToolStripLabel ts = new ToolStripLabel();

ts.Text = "Running...";

// ProgressBar to show time elapsing

pb = new ToolStripProgressBar();

mohsen_mahyar@yahoo.com

248

pb.Step = 10; // Size of each step or increment

pb.Minimum = 0;

pb.Maximum = 120; // Allow 12 steps

// Status strip to contain components

statusStrip1 = new StatusStrip();

statusStrip1.Height = 20;

statusStrip1.AutoSize = true;

// Add components to strip

statusStrip1.Items.AddRange(new ToolStripItem[] {

ts, pb, panel1 } );

this.Controls.Add(statusStrip1);

}

private void timer_Tick(object sender, EventArgs e)

{

// Get difference between current datetime

// and form startup time

TimeSpan ts = DateTime.Now.Subtract(startDate);

string elapsed = ts.Hours.ToString("00") + ":" +ts.Minutes.ToString("00") +

":" + ts.Seconds.ToString("00");

((StatusStripPanel)statusStrip1.Items["clock"]).Text= elapsed;

// Advance progress bar

if (pb.Value == pb.Maximum) pb.Value = 0;

pb.PerformStep(); // Increment progress bar

}

که وقت سپری شده را نشان م ی دهد، چندین خصوصیت دارد که ظاهر و موقعیت آن را کنترل StatusStripPanel

برای نمایش یک تصویر دار د . کلاس Image می کند. علاوه بر موارد نشان داده شده در اینجا، آن یک خصوصیت

ارث بری می کند. هر دو م ی توانند برای ن م ایش متن بکار روند، اما پانل ToolStripLabel از کلاس StatusStripPanel

فاقد آن است. ToolStripLabel دارد که BorderStyle یک خصوصیت

-7-15 ایجاد کنترل های سفارشی

در بعضی مواقع، با یک کار برنام ه نویسی روبرو خواهید شد که کنتر ل های استاندارد موجود نیاز شما را برآورده نم ی کند .

را بسط دهید تا متناسب با محتوای آن رنگ پس زمینه تغییر کن د . یک مجموعه TextBox ممکن است بخواهید یک کنترل

مکرراً استفاده شده از دکم ه های رادیویی را در یک کنترل واحد گرو ه بندی کنید یا کنترل جدید ایجاد کنید که یک ساعت

دیجیتال با تاریخی در زیر آن نشان می دهد. این نیازها با سه نوع اساسی از کنترل های سفارشی مرتبط هستند:

-1 کنترلی که از یک کنترل موجود مشتق م یشود و عملیات آن را بسط می دهد.

-2 یک کنترل که به عنوان یک ظرف بکار م ی رود تا اجازه دهد چندین کنترل باهم تعامل داشته باشن د . این نوع کنترل

مستقیماً از Control به عنوان یک کنترل کاربری بیان م ی شوند. آن به جای

مشتق می شود و کنتر لهای استانداردی انجام می دهد. System.Windows.Forms.UserControl

مشتق م ی شود. این نوع کنترل از ابتدا ساخته م ی شود و توسع ه دهنده Control -3 کنترلی که مستقیماً از کلاس

آن، پیاد ه سازی متدها و خصوصیات آن ر ا بر عهده دارد و باید طوری باشد که بوسیله GUI مسئولیت ترسیم واسط

کد قابل دستکاری باشد. حال نحوه بسط یک کنترل موجود و ایجاد یک کنترل کاربری را بررسی م یکنیم.

فصل پانزدهم کنترل های فرم ویندوز

249

-1-7-15 بسط یک کنترل

مشتق TextBox ساده ترین راه ایجاد یک کنترل سفارشی، بسط یک کنترل موجود اس ت . برای شرح دادن آن، یک کلاس از

به عنوان TextBox را با NumericTextBox کنید که فقط ارقام را م ی پذیرد که کنترل کاملاً ساد ه ای است . کلاس جدید

است و فقط یک رقم KeyPress کلاسی پایه آن ایجاد کنی د . تنها کد مورد نیاز یک اداره کننده رویداد برای پردازش رویداد

می پذیرد.

class NumericTextBox: TextBox

{

public NumericTextBox()

{

this.KeyPress += new KeyPressEventHandler(TextBoxKeyPress);

}

protected void TextBoxKeyPress(object sender,

KeyPressEventArgs e)

{

if (! char.IsDigit(e.KeyChar)) e.Handled = true;

}

}

کامپایل شود، می تواند روی هر فرمی اضافه شود. DLL بعد از اینکه کنترل بسط یافته به یک فایل

سفارشی UserControl -2-7-15 ایجاد یک

یک کنترل کاربری را همانند یک فرم تصور کنی د . شبیه یک فرم، آن ظرفی را فراهم م ی سازد که چیزهای مرتبط روی آن

جای می گیرند. بعد از کامپایل، کل مجموعه کنتر ل های روی آن بصورت یک کنترل کاربری واحد رفتار م ی کنند. البته کاربران

هنوز می خواهند با هر کدام از کنتر ل های عضو مستقیماً تعامل داشته باشن د . دسترسی به اعضای کنترل در زمان طراحی و

برنامه نویسی از طریق متدها و خصوصیات تعریف شده روی کنترل کاربری در دسترس است.

است که تغییر اندازه و محل کنتر لها را ساده می سازد . VS.Net همچون IDE ساده ترین راه طراحی ی ک کنترل بوسیله یک

است. این Windows Control Library بار کردن یک پروژه از نوع VS.NET روش معمول ایجاد یک کنترل کاربری در

Add – Add 􀃆 با انتخاب Windows Application عمل پنجره طراحی کنترل را سریعاً بار م یکند. پنجره طراحی در

پروسه ایجاد یک کنترل را سرعت م ی دهد، VS.NET و مسیرهای دیگر قابل اضافه کردن است. اگرچه User Control

آن هیچ کد اختصاصی تولید نم یکند.

User Control یک مثال از

به عنوان یک مثال، اجازه دهید یک کنترلی ایجاد کنیم که م ی تواند بر ای ایجاد یک پرسشنامه بکار رو د . کنترل یک برچسب

برای نمایش سؤال و سپس دکمه رادیویی بر روی یک کنترل پانل برای نمایش گزین ه های جواب را در بر دار د . کنترل سه

و دیگری دکمه Panel خصوصیت دارد : یکی برای انتساب سؤال به برچسب، یکی برای تنظیم رنگ پس زمینه کنترل

رادیویی انتخاب شده توسط کاربر به عنوان جواب را تعیین م یکند.

16 طرح بندی کنترل کاربر و اسامی انتساب شده به هر کنترل را نشان م یدهد. - شکل 15

16- شکل 15

mohsen_mahyar@yahoo.com

250

1 نشان داده می شود. UserControl در ایجا نحوه نمایش اعضا بصورت فیلدهایی از کلاس

public class UserControl1 : System.Windows.Forms.UserControl

{

private Panel panel1;

private RadioButton radAgree;

private RadioButton radDisagree;

private RadioButton radUn;

private Label qLabel;

PanelColor . برچسب را با سؤال مقداردهی م ی کند Text خصوصیت SetQ . 6 که سه خصوصیت را شامل اس ت - مثال 15

Choices جواب انتخاب شده بوسیله کاربر را بصورت یک نوع داده شمارشی Choice رنگ پانل را قرار م ی دهد و

برمی گرداند.

public enum Choices

{

Agree = 1,

DisAgree = 2,

Undecided = 3,

}

public string SetQ

{

set {qLabel.Text = value;}

get {return(qLabel.Text);}

}

public Color PanelColor

{

set {panel1.BackColor= value;}

get {return(panel1.BackColor);}

}

public Choices Choice

{

get

{

Choices usel;

usel = Choices.Undecided;

if (radDisagree.Checked) usel= Choices.DisAgree;

if (radAgree.Checked) usel = Choices.Agree;

return(usel);}

}

}

سفارشی UserControl استفاده از

توسعه داده شود، آن بطور اتوماتیک به جعبه VS.NET اگر کنترل کاربری به عنوان بخشی از پروژه برنامه کاربردی ویندوزی

اضافه می شود. بطور ساده آن را انتخاب کرده و روی فرم بکشید. در غیر اینصورت باید Windows Forms ابزار در زیر برگه

فصل پانزدهم کنترل های فرم ویندوز

251

را انتخاب کنید، کنترل را جستجو کرده و آن را به جعبه Customize ToolBox روی برگه جعبه ابزار کلیک راست کرده و

ابزار اضافه کنید.

2 روی فرم قرار Q 1 و Q 17 یک مثال از کاربرد کنترل جدید را فراهم م ی سازد. در این مثال، دو نمونه از کنترل بنام - شکل 15

دارند.

private usercontrol.UserControl1 Q1;

private usercontrol.UserControl1 Q2;

17- شکل 15

را بکار VS.NET یا در سازنده خصوصیات را مقداردهی کر د . اگر Form.Load می توان در زمان اجرا، در اداره کننده رویداد

خصوصیات را مقداردهی کرد. Property Browser می برید، می توان در زمان طراحی بوسیله

Q1.SetQ = "The economy is performing well";

Q2.SetQ = "I'm not worried about the budget deficit.";

Q1.PanelColor = Color.Beige;

مرحله نهایی در برنامه کاربردی، انجام دادن کارهایی است که بعد از کامل شدن پرسشنامه لازم هستن د . زمانی که روی دکمه

Choice باشد، خصوصیت UserControl کلیک می شود، کد زیر همه کنتر ل های روی فرم را طی م ی کند. اگر نوع کنترل

آن برای برگرداندن جواب کاربر استفاده می شود.

private void button1_Click(object sender, System.EventArgs e)

{

foreach (Control ct in this.Controls)

{

if (ct is usercontrol.UserControl1)

{

UserControl1 uc = (UserControl1)ct;

// Display control name and user's answer

MessageBox.Show(ct.Name+" "+uc.Choice.ToString());

}

}

}

در زمان طراحی UserControl کار با

Property توسعه م یدهید که کنترل سفارشی بکار م یبرد، شما خواهید دید که VS.NET اگر یک برنامه کاربردی بوسیله

قرار داده م ی شوند Misc همه خصوصیات خواندنی / نوشتنی را لیست م ی کند. بطور پیش فرض، آنها در یک طبقه Browser

mohsen_mahyar@yahoo.com

252

و هیچ توصیفی به آنها اختصاص نیافته اس ت . برای حرف ه ای کردن کنتر ل های خودتان، باید یک طبق ه 1 برای رویداده ا و

خصوصیات کنترل ایجاد کنید و یک توصیف متنی برای هر عضو طبقه اضافه کنید.

موجود هستند که از فراداد ه های مبتنی بر صفات الحاق شده به اعضای یک Property Browser طبقه ها و توصیف ها در

است. PanelColor نوع داده می آیند. این یک مثال از صفات اضافه شده به خصوصیت

[Browsable(true),Category("QControl"),Description("Color of panel behind

question block")]

public Color PanelColor

{

set {panel1.BackColor = value;}

get {return (panel1.BackColor);}

}

است . دو صفت دیگر، true مشخص م ی کند آیا خصوصیت در کاوشگر نمایش داده شو د . بطور پیش فرض Browsable صفت

Property طبقه ای که خصوصیت در زیر آن نمایش داده م یشود و متنی که در هنگام انتخاب خصوصیت در زیر

ظاهر می گردد را مشخص می کنند. Browser

همواره به خاطر داشته باشید که انگیزه ایجاد کنتر ل های کاربری سفارشی قابلیت استفاده مجدد اس ت . اگر کنترلی فقط یک

بار استفاده می شود، نیازی نیست زمانی برای آن صرف شود.

-8-15 استفاده از کشیدن و انداختن بوسیله کنتر لها

NET. . بوده اس ت GUI توانایی کشیدن داد ه ها از یک کنترل و انداختن به کنترل دیگر یک ویژگی آشنای برنام ه نویسی

بوسیله چندین کلاس و نوع شما ر شی این ویژگی را پشتیبانی م ی کند، تا یک کنترل قادر باشد مقصد یا مبدأ عمل کشیدن و

انداختن باشد.

مروری بر کشیدن و انداختن

عمل مورد نظر، یک کنترل مبدأ که داد ه هایی برای انتقال یا کپی دارد و یک کنترل مقصد که داد ه های کشیده شده را

آغاز م ی کند . اداره (MouseDown دریافت می کند لازم دار د . مبدأ عمل مورد نظر را در پاسخ به یک رویداد (معمولاً رویداد

شروع م یکند. این متد دو پارامتر دار د : داده ای DoDragDrop کننده رویداد کنترل مبدأ عمل واقعی را بوسیله احضار متد

که ا ث رات و عملکردهایی که کنترل مبدأ پشتیبانی DragDropEffects که کشیده م ی شود و یک پارامتر نوع شمارشی

4 را ببینید). - می کند را مشخص م یکند. (جدول 15

4- جدول 15

عضو توصیف

داده به کنترل مقصد منتقل م ی شود و در کنترل مقصد برای نمایش محل All

داده های جدید عمل لغزاندن رخ م یدهد.

داده ها از مبدأ به مقصد کپی م یشوند. Copy

داده ها از مبدأ به مقصد پیوند داده می شوند . Link

داده ها از مبدأ به مقصد منتقل م یشوند. Move

1 Category

فصل پانزدهم کنترل های فرم ویندوز

253

ارائه م ی کند تا ترسیم روی آن Graphics سطح کنترل را به صورت یک شی None

رخ دهد. کنترل مقصد از پذیرفتن داده سر باز م یزند.

لغزاندن رخ می دهد یا روی کنترل مقصد رخ خواهد داد. Scroll

کنترل زیر موقعیت جاری اشار ه گر را تعیین م ی کند . DoDragDrop هنگامی که ماوس در سرتاسر فرم حرکت م ی کند، متد

آن رها DragEnter باشد، آن کنترل به عنوان هدف انداختن معتبر است و رویداد true آن AllowDrop اگر خصوصیت

دو کار دار د : بررسی اینکه داده کشیده شده یک نوع داده قابل قبول است و DragEnter می شود. اداره کننده رو ی داد

مطمئن شود عمل درخواست شده نیز قابل پذیرش اس ت . زمانی که عمل انداختن واقعی رخ می دهد، کنترل مقصد رویداد

18 را ببینید). - رها می سازد. این اداره کننده رویداد، مسئول قرار دادن داده در کنترل هدف است (شکل 15 DragDrop

18- شکل 15

کنترل مبدأ عملیات پاکسازی را انجام م ی دهد. برای مثال، اگر عملیات ،DragDrop بعد از پایان یافتن اداره کننده رویداد

شامل انتقال داده باشد، بایستی داده از کنترل مبدأ حذف شود.

- برای شرح دادن این اید ه ها، یک برنامه کاربردی برای انتساب بازیکنان از یک فهرست بازیکنان به تیم ایجاد کنی د (شکل 15

ایجاد م ی شود. هر دو لیست بوسیله کادرهای TeamA به لیست Available با کشیدن اسامی از TeamA .( 19 را ببینی د

طوری تنظیم شده که می توان فقط یک قلم داده انتخاب کرد. Available لیست پیاده سازی می شوند و لیست

19- شکل 15

یک نام با فشار دادن دکمه سمت راست ماوس و کشیدن آن به لیست هدف انتخاب م ی شود. برای جالب کردن عمل، نگه

به جای انتقال نام یک کپی از آن ایجاد م ی کند. بعد از ایجاد فرم و کنتر ل های آن، گام اول تنظیم کنترل Ctrl داشتن کلید

برای اداره کردن رویدادهای (lstTeamA) و کنترل هدف MouseDown برای پاسخ دادن به رویداد (lstPlayers) مبدأ

می باشد: DragDrop و DragEnter

lstPlayers.MouseDown +=

new MouseEventHandler(Players_MouseDown);

mohsen_mahyar@yahoo.com

254

lstTeamA.DragEnter += new DragEventHandler(TeamA_DragEnter);

lstTeamA.DragDrop += new DragEventHandler(TeamA_Drop);

گام بعدی کدنویسی اداره کننده رویداد روی کنتر ل های مبدأ و هدف است، که عملیات کشیدن و انداختن را پیاد ه سازی

می کنند.

مسئولیت های کنترل مبدأ

انتخاب شده باش د . سپس ListBox ابتدا جهت اطمینان بررسی م ی کند یک قلم د اده از MouseDown اداره کننده رویداد

به آن (Copy و Move) را فراخوانی م ی کند و مقدار عنصر انتخاب شده را به همراه تأثیرات قابل پذیرش DoDragDrop متد

دارد که ترکیب بیتی مقادیر داده شده FlagsAttribute یک صفت DragDropEffects ارسال می کند. نوع شمارشی

به آن را ممک ن می سازد. مقدار برگردانده شده از این متد، همان تأثیری است که توسط کنترل هدف استفاده م ی شود . اداره

کننده رویداد از این اطلاعات برای انجام دادن هر عمل مورد نیاز جهت پیاد ه سازی تاثیر استفاده م ی کند. در این مثال، یک

عمل انتقال بدین معنی است که باید مقدار کشیده شده از کنترل مبدأ حذف شود.

private void Players_MouseDown(object sender, MouseEventArgs e)

{

if ( lstPlayers.SelectedIndex >=0)

{

string players;

int ndx = lstPlayers.SelectedIndex;

DragDropEffects effect;

players = lstPlayers.Items[ndx].ToString();

if(players != "")

{

// Permit target to move or copy data

effect = lstPlayers.DoDragDrop(players,

DragDropEffects.Move | DragDropEffects.Copy);

// Remove item from ListBox since move occurred

if (effect == DragDropEffects.Move)

lstPlayers.Items.RemoveAt(ndx);

}

}

}

مسئولیت های کنترل هدف

را پیاد ه سازی کند . هر دو رویداد یک پارامتر از DragDrop و DragEnter کنترل مقصد باید اداره کنند ه های رویدادهای

- می گیرند که اطلاعات مورد نیاز جهت پردازش رویداد کشیدن و انداختن را در بر دارن د . (جدول 15 DragEventArgs نوع

5 را ببینید)

5- جدول 15

کاربرد توصیف

AllowedEffect

پشتیبانی شود. Move تأثیراتی که بوسیله کنترل مبدأ پشتیبانی م یشوند. مثلاً اگر

== (if ((e.AllowedEffect & DragDropEffects.Move

(DragDropEffects.Move

بر م ی گرداند که داده تخصیص یافته به این عمل را در ب ر دارد . این IdataObject یک Data

شی متدهایی برای برگرداندن اطلاعاتی درباره داد ه ها پیاد ه سازی م ی کند . متد

نوع داده را بررسی م یکند. GeTDataPresent داده ها را واکشی می کند و GetData

فصل پانزدهم کنترل های فرم ویندوز

255

Effect

تأثیر انداختن کنترل هدف را مقداردهی کرده یا به دست می آورد.

و دکمه های ماوس را با یک عدد صحیح بر Shift ،Ctrl ،Alt حالت کلیدهای KeyState

می گرداند.

-1 دکمه سمت چپ ماوس 2- دکمه سمت راست ماوس

Ctrl 8 – کلید Shift -4 کلید

Alt -16 دکمه وسط ماوس 32 – کلید

مشخص می شوند. y و x مختصات اشاره گر ماوس با X,Y

بصورت زیر استفاده می شوند: KeyState و Effect ،Data اعضای

جهت اطمینان از قابل پرداز ش بودن نوع داده DragEnter بوسیله اداره کننده رویداد Data.GetDataPresent •

توسط کنترل هدف استفاده می شود.

استفاده Data.GetData برای دسترسی به داده کشی د ه شده روی آن، از متد DragDrop • اداره کننده رویداد

است که فرمت داده بازگشتی را مشخص DataFormats می کند. پارامتر این متد معمولاً یک فیلد ایستا از کلاس

می کند.

اداره کننده رویداد

مقداردهی م ی شود، تا کنترل مبدأ را از نحوه پ ر دازش داده های DragEnter توسط اداره کننده رویداد Efffect •

جلوگیری می کند. DragDrop از رها شدن رویداد DragDropEffects.None آن آگاه سازد. مقدار

8 کد دو اداره کننده رویداد مورد نظر را نشان م یدهد. - مثال 15

8- مثال 15

enum KeyPushed

{

// Corresponds to DragEventArgs.KeyState values

LeftMouse = 1,

RightMouse = 2,

ShiftKey = 4,

CtrlKey = 8,

MiddleMouse = 16,

AltKey = 32,

}

private void TeamA_DragEnter(object sender, DragEventArgs e)

{

KeyPushed kp = (KeyPushed) e.KeyState;

// Make sure data type is string

if (e.Data.GetDataPresent(typeof(string)))

{

// Only accept drag with left mouse key

if ((kp & KeyPushed.LeftMouse) == KeyPushed.LeftMouse)

{

if ((kp & KeyPushed.CtrlKey) == KeyPushed.CtrlKey)

{

e.Effect = DragDropEffects.Copy; // Copy

}

mohsen_mahyar@yahoo.com

256

else

{

e.Effect = DragDropEffects.Move; // Move

}

}

else // Is not left mouse key

{

e.Effect = DragDropEffects.None;

}

}

else // Is not a string

{

e.Effect = DragDropEffects.None;

}

}

// Handle DragDrop event

private void TeamA_Drop(object sender, DragEventArgs e)

{

// Add dropped data to TextBox

lstTeamA.Items.Add(

(string) e.Data.GetData(DataFormats.Text));

}

را راح ت تر و خواناتر ساز د . عمل KeyState ایجاد م ی شود، تا بررسی مقادیر enum یک FlagsAttribute بوسیله صفت

بر می گرداند. Ctrl مربوط به کلید CtrlKey 8)، یک مقدار مساوی مقدار CtrlKey( با مقدار KeyState منطقی and

می توان در یک برنامه یک کنترل را به عنوان مبدأ و هدف کشیدن و انداختن بکار گرف ت . می توانید به هر دو لیست مثال

قبلی هر دو نقش مبدأ و هدف بدهید تا انعطاف بالاتری داشته باش د . این عمل به شما اجازه م ی دهد یک بازیکن را از لیست

برگردانید. بدین منظور لازم است اداره کننده های مناسب رویداد اضافه شوند. lstPlayers ListBox به lstTeamA

فرمت های از قبل تعریف شد ه ای دارد که م ی تواند DataFormats توجه: کشیدن و رها کردن فقط برای متن نیس ت . کلاس

و مقادیر متعدد دیگر Wave Audio ،PenData ،Bitmap استفاده شوند. اینها شامل موارد static به عنوان فیلدهای

هستند.

-9-15 کاربرد منابع

را برای بزر گ کردن و نمایش یک تصویر کوچک انتخاب شده نشان PictureBox 7 این فصل، کاربرد کنتر ل های - شکل 15

داد. هر تصویر کوچک از یک فایل محلی به برنامه کاربردی بارگذاری می شود.

tn1 = new PictureBox();

tn1.Image = Image.FromFile("c:\\schiele1.jpg");

در مسیر فهرست ریشه کامپیوتر کاربر موجود باشد،این کد خوب کار م یکند . با این .jpg1schiele در صورتی که ف ایل

وجود، تکیه بر مسیر فهرست برای یافتن این فایل دو عیب واضح دار د : فایل می تواند توسط کاربر حذف یا تغییر نام داده

شود و چون منبع خارجی است، باید در حین نصب مجزا از کد اداره شود . این مشکل را م ی توان از طریق تعبیه کردن تصویر

در یک اسمبلی حل کرد.

را در نظر بگیرید که در چندین کشور با زبا ن های مختلف استفاده می شود. تلاش ما برای وفق دادن GUI یک برنامه کاربردی

صفحات نمایش با هر کشوری اس ت . حداقل چیزی که نیاز است، نمایش یک متن با زبان اصلی و تغییر تصاویر و موقعیت

کنترل های روی فرم اس ت . راه حل مناسب، منطق برنامه را از واسط کاربر جدا م ی کند، در این راه حل به ازای هر کشور منابع

قابل تعویض در نظر گرفته م یشود که بر اساس تنظیمات فرهنگ کامپیوتر بارگذاری می شوند.

چند فایل منبع خاص را NET. . ایده مشترک این دو مثا ل ، نیاز برای مقیدکردن یک منبع خارجی به یک برنامه کاربردی اس ت

فراهم می کند، که م ی توانند برای نگه داشتن هر داد ه ی غیراجرایی همچون تصویر، رشت ه ها و داد ه های دائمی استفاده شون د .

فصل پانزدهم کنترل های فرم ویندوز

257

این فایل های منبع می توانند در یک اسمبلی قرار گیرند یا در داخل اسمبل یهای پیرو 1 کامپایل شوند تا بتوانند بطور دلخواه

بوسیله یک اسمبلی اصلی برنامه کاربری دستیابی شوند.

حال اصول کار با فای ل های منبع و نحوه تعبیه آنها در اسمبلی را بررسی م یکنیم و به نقش اسمبل یهای پیرو در برنام ه های

کاربردی محلی نگاهی می کنیم.

-1-9-15 کار با فای لهای منبع

و فای ل های XML با فرمت resx.* با فرمت مقدار / نام و فای ل های txt.* فایل های منبع سه فرمت دارن د : فایل های

با فرمت دودوی ی .چراسه تا ؟ فرمت متنی یک روش ساده برای اضاف ه کردن منابع رشت ه ای فراهم م ی سازند . resources.*

است . آنها XML رشت ه ها و اشیاء دیگر همچون تصاویر را پشتیبانی م ی کند و نسخه دودویی، هم ارز دودویی فایل ،XML نسخه

تنها فرمتی هستند که م ی توانند در یک اسمبلی تعبیه شو د . فرمت های دیگر قبل از اتصال به یک اسمبلی باید به فایل

را شرح می دهد. resources 20 روش های ایجاد یک فایل - تبدیل شوند. شکل 15 resources

انواع داد ه ای مورد نیاز برای دستکاری فای ل های منبع را در بر دار د . آن کلا س هایی برای System.Resources فضای نامی

خواندن و نوشتن فرمت های فایل منبع، بارگذاری منابع از یک اسمبلی به یک برنامه را شامل است.

20- شکل 15

ایجاد رشت ههای منبع از روی یک فایل متنی

فایل های متنی که مقدارهای رشت ه ای دارند، در صورتی که یک برنامه لازم دارد یک واسط سفارشی در محیط اجرایی خود

فراهم سازد، مفید هستن د . یک فایل منبع نیاز برای کدنویسی نسخ ه های چندگانه از یک برنامه کاربردی را حذف م ی کند. به

جای آن، توس ع ه دهنده یک برنامه کاربردی و چندین فایل منبع ایجاد م ی کند که برچس ب های واسط، متن، پیا م ها و عنوا ن ها

تعبیه شده در اسمبلی را دار د . یک نسخه English یک برنامه فایل منبع English را در بر دارن د . برای مثال، یک نسخه

را تعبیه خواهد کر د . ایجاد رشته های منبع و دسترسی به آنها در یک برنامه کاربردی چهار گام German فایل منبع German

نیاز دارد.

-1 یک فایل متنی بوسیله رشت ه های مقدار / نام ایجاد کنید، که در برنامه کاربردی استفاده خواهند ش د . فایل فرمت زیر را

دارد.

;German version (this is a comment)

1 Sattelite

mohsen_mahyar@yahoo.com

258

Language=German

Select=Wählen Sie aus

Page=Seite

Previous=Vorherig

Next=Nächst

تبدیل کنید. Resources فایل متنی را به فایل Resource File Generator -2 با استفاده از نرم افزار سودمند

resgen.exe:

> resgen german.txt german.resources

انتظار دارد. resgen 8 ذخیره شود، همان چیزی که UTF- توجه کنید که فایل متنی با ویرایشگر متن با کد گذاری

را برای خواندن رشت ه ها از فایل منبع بکار بری د . همانطور که نشان System.Resources.ResourceManager -3 کلاس

دو آرگومان م ی پذیرد : نام فایل منبع و اسمبلی که آن را در بردار د . کلاس ResourceManager داده شده، کلاس

است و در این مثال برای برگرداندن اسمبلی جاری استفاده System.Reflection بخشی از فضای نامی Assembly

آن بوسیله برنامه کاربردی جهت بازیابی رشت ه ها بر اساس نام رشت ه ها از GetString می شود. بعد از ایجاد مدیر منبع، متد

فایل منبع استفاده می شود.

// new ResourceManager(resource file, assembly)

ResourceManager rm = new

ResourceManager("german",Assembly.GetExecutingAssembly());

nxtButton.Text= rm.GetString("Next");

-4 برای اینکه کد قبلی اجرا شود، فایل منبع باید بخشی از برنامه کاربردی باش د . آن در زمان کامپ ا یل به اسمبلی تعبیه

می گردد.

csc /t:exe /resource:german.resources myApp.cs

Resources. برای ایجاد یک فایل ResourceWriter کاربرد کلاس

راه حل قبلی برای اضافه کردن رشت ه ها به یک فایل منبع خوب کار م ی کند. با این وجود، یک فایل منبع م ی تواند اشیاء دیگری

همچون تصاویر و اشکال مکان نما را در بر دارد.

را پیشنهاد م ی کند . System.Resources.ResourceWriter کلاس ،Resources برای قرار دادن اینها در یک فایل

را نشان م ی دهد و متد ResourceWriter کد زیر در یک فایل سودمند یا کمکی جا م ی گیرد. نحوه ایجاد یک شی

را برای ذخیره یک رشته و تصویر در یک فایل منبع بکار می برد. AddResource

IResourceWriter writer = new ResourceWriter("myResources.resources");

// .Resources output file

Image img = Image.FromFile(@"c:\schiele1.jpg");

rw.AddResource("Page","Seite"); // Add string

rw.AddResource("artistwife",img); // Add image

rw.Close(); // Flush resources to the file

برای دستیابی به منابع ResourceManager کاربرد کلاس

را برای دستیابی به منابع بوسیله برنامه ResourceManager همانطور که بوسیله منابع رشت ه ای انجام دادید، ما کلاس

کاربردی بکار می بریم. برای شرح مطلب، به کد نمایش داده شده در ابتدای این بخش توجه کنید.

tn1.Image = Image.FromFile("C:\\schiele1.jpg");

به ما اجازه م ی دهد، ارجاع یک منبع خارجی را جایگزین کنی م . در این حالت، تصویر بخشی از اسمبلی ResourceManager

جایگزین می شود. GetObject مثال اخیر بوسیله متد GetString خواهد بود. متد

ResourceManager rm = new ResourceManager("myresources",

Assembly.GetExecutingAssembly());

// Extract image from resources in assembly

tn1.Image = (Bitmap) rm.GetObject("artistwife");

فصل پانزدهم کنترل های فرم ویندوز

259

resx. برای ایجاد یک فایل ResXResourceWriter کاربرد کلاس

اضافه resx. است، با استثناء اینکه منابع به یک فایل ResourceWriter شبیه کلاس ResXResourceWriter کلاس

میانی نمایش م ی دهد. این فرمت در زمان ایجاد برنام ه های سودمند برای خواندن، XML می شوند که منابع را در یک فرمت

بسیار مشکل است. Resource مدیریت و ویرایش منابع مفید است. ویرایش منابع در فایل های منبع

ResXResourceWriter rwx = new ResXResourceWriter(@"c:\myresources.resx");

Image img = Image.FromFile(@"c:\schiele1.jpg");

rwx.AddResource("artistwife",img); // Add image

rwx.Generate(); // Flush all added resources to the file

را به همراه علام ت های مقدار / نام برای هر ورودی منبع در بر دار د . داده واقعی XML فایل منتج شده، اطلاعات سرآیند

است که در ویرایشگر متنی myresources.resx (تصویر) مابین علامت های مقدار ذخیره م ی شود. این یک بخش از فایل

دیده م یشود.

<data name="face" type="System.Drawing.Bitmap, System.Drawing,

Version=1,0,3300,0,Culture=neutral,

PublicKeyToken=b03f5f7f11d50a3a" mimetype="application/xmicrosoft.

net.object.bytearray.base64">

<value> ---- Actual Image bytes go here ----

</value>

می تواند چندین نوع منبع را در بر resx. توجه کنید : اگرچه این مثال فقط یک تصویر را در فایل ذخیره م ی کند، یک فایل

گیرد.

resx. برای خواندن یک فایل ResXResourceReader کاربرد کلاس

شمارنده) برای طی کردن همه علام ت های یک فایل ) IdictionaryEnumerator یک ResXResourceReader کلاس

بکار می برد. این قطعه کد محتوای یک فایل منبع را لیست م یکند. resx.

ResXResourceReader rrx = new ResXResourceReader("c:\\myresources.resx");

// Enumerate the collection of tags

foreach (DictionaryEntry de in rrx)

{

MessageBox.Show("Name: "+de.Key.ToString()+"\nValue: " +

de.Value.ToString());

// Output --> Name: artistwife

// --> Value: System.Drawing.Bitmap

}

rrx.Close();

resources. به یک فایل resx. تبدیل یک فایل

تبدیل م یشود. resources. به فایل resx. یک فایل resgen.exe با استفاده از برنامه

resgen myresources.resx myresources.resources

را resources. اگر پارامثر دوم نباشد، فایل خروجی همنام پارامتر اول اس ت . همچنین این برنامه سودمند م ی تواند یک فایل

تبدیل کند. گرامر همانند مثال قبلی است. resx. به یک فایل

و منابع VS.NET-2-9-15

ایجاد م ی کند و آنها را همانند منابع اضافه شده به پروژه بروز م ی کند. resx. بطور اتوماتیک برای هر فرم یک فایل VS.NET

می توانید فایل های منبع را ببینید. Solution Explorer در Show All File با انتخاب گزینه

mohsen_mahyar@yahoo.com

260

ایجاد م ی شوند . در خود کد، یک شی resx. از فای ل های resources. در زمان اجرای فرمان ساخت پروژه، فای ل های

برای فراهم کردن دسترسی به منابع در زمان اجرا ایجاد م یشود. ResourceManager

ResourceManager resources = new ResourceManager(typeof(Form1));

کاربرد فایل های منبع برای ایجاد فرم های محلی

یک برنامه کاربردی محلی برنام ه ای است که چندین زبان را پشتیبانی م ی کند. معمولاً این بدین معنی ،NET. در زبان ماد ر ی

است که واس ط های کاربری مختلف برای نمایش متون و عک س های سفارشی شده با فرهن گ ها یا کشورهای فردی فراهم

برای پشتیبانی از این برنام هها طراحی می شوند. NET. می سازد. فایل های منبع

خلاصه اینکه، فای ل های منبع م ی توانند برای هر فرهنگ پشتیبانی شده تنظیم شون د . برای مثال، ممکن است متون و برچسب

در فایل دیگری قرار گیر د . French در یک فایل قرار گیرند و متون و برچسب کنتر ل های واسط German کنترل های واسط

در زمان اجرای برنامه کاربردی، آن تنظیمات فرهنگ جاری را بدست م ی آورد و منابع مناسبی را بکار م ی برد . این عمل با

انجام م ی شود. فایل های منبع بصورت اسمبل ی های پیرو بست ه بندی CultureInfo تشخیص فای ل های منبع به کلاس

ذخیره می شوند. DLL می شوند و در فای لهای

VS.NET محلی کردن منابع با استفاده از

قرار دهی د . این عمل هر کنترل روی فرم را با یک true آن را Localizable برای محل ی کردن یک فرم، باید خصوصیت

فرم ذخیره شده باش د . این عمل باعث م ی شود، برای هر resx. منبع دگرگون م ی کند، که خصوصیات آن کنترل در فایل

مجزایی ایجاد شود. resx. فرهنگی که یک فرم پشتیبانی م یکند فایل های

اصطلاحات .(en-us) همانطور که م ی دانید، هر فرهنگی با دو کاراکتر از زبان و دو کاراکتر اختیاری از کشور مشخص م ی شود

فرهنگ بی اثر و فرهنگ خاص برای شرح دادن یک فرهنگ هستن د . یک فرهنگ خاص، زبان و کشور خاصی دار د . یک

می توانید لیست کاملی از اسامی فرهن گ ها را CultureInfo در کلاس MSDN فرهنگ بی اثر فقط زبا ن دارد . در مستندات

بیابید.

.

21- شکل 15

فرم را به زبان محلی Language مقدار خصوصیت properties برای اختصاص دادن فرهن گ های دیگر به فر م ، در پنجره

فقط برای آن فرهنگ ذخیره شود و بقیه را تحت تأثیر قرار resx. دیگر تنظیم کنی د . این عمل منجر م ی شود یک فای ل

نمی دهد.

21 می بینید، در زمان ساخت پروژه، یک اسمبلی - فایل های منبع در پوش ههایی ذخیره می شوند. همانطور که در شکل 15

با آن پوشه DLL 22 می بینند). این فایل - پیرو ایجاد می شود و منابع هر فرهنگی را در بر می گیرد( همانطور که در شکل 15

هم نام است

22- شکل 15

فصل پانزدهم کنترل های فرم ویندوز

261

تعیین منابع محلی در زمان اجرا

دارد که تنظیمات CurrentThread.CurrentUICulture بطور پیش فرض یک ریسمان برنامه کاربردی خصوصیت

این مقدار را برای تعیین م نابعی که باید بارگذاری شوند، بکار ResourceManager فرهنگ ماشین محلی را دار د . نمونه های

می برند. آنها اسمبلی پیرو را برای تنظیمات این فرهنگ جستجو م ی کنند(به همین دلیل نا م گذاری و موقعیت پوش ه ها و

فایل های منبع مهم هستند). اگر منابع فرهنگ خاص پیدا نشود، منابع اسمبلی اصلی استفاده می شوند.

به CurrentUICulture توجه: ساده ترین روش ت ست یک برنامه کاربردی با فرهن گ های دیگر، تغییر مقدار خصوصیت

را تعیین German فرهنگ خاص ()InitializeComponent فرهنگ دلخواه خود اس ت . برای مثال، دستور زیر قبل از

می کند.

System.Threading.Thread.CurrentThread.CurrentUICulture =

new System.Globalization.CultureInfo("de-DE");

VS.NET ایجاد یک اسمبلی پیرو بدون

یکی از مزایای کاربرد اسمبل ی های پیرو، امکان اضافه کردن آنها به یک برنامه کاربردی و تغییر دادن آنها بدون کامپایل مجدد

برنامه کاربردی اس ت . تنها نیاز این است که یک پوشه در مسیر مناسب ق رار داده شود و اسمبلی پیرو و پوشه اسامی مناسب

داشته باشند.

تبدیل شده است. می توانید بصورت دستی French Canadian دارید که بوسیله ی مترجم به resx. فرض کنید یک فایل

در سه گام یک اسمبلی پیرو ایجاد کرده و به برنامه کاربردی اضافه کنید:

تبدیل کنید. resources. را به فایل resx. -1 فایل

filmography.Form1.fr-CA.resources

را به یک اسمبلی پیرو تبدیل resources. فایل (Assembly Linker (Al.exe -2 با استفاده از برنامه سودمند

کنید.

Al.exe

/t:lib

/embed:filmography.Form1.fr-CA.resources

/culture:fr-CA

/out:filmography.resources.dll

ایجاد کرده و فایل اسمبلی جدید را به آن کپی کنید. Release را در زیر پوشه fr-CA پوشه

با قرار دادن اسمبلی پیرو در یک پوشه مناسب، آن فوراً برای اجرا در دسترس است و لازم نیست برنامه کاربردی مجدداً

کامپایل شود.

-10-15 خلاصه

موجود هستند. NET FCL. در GUI • بیش از 50 کنترل

mohsen_mahyar@yahoo.com

262

این فصل تعدادی از کنتر ل های مهم را بررسی کرده اس ت . همه آنها از کلاس

را به ارث Control مشتق شد ه اند که خصوصیات و متدهای کلاس System.Windows.Forms.Control

برده اند.

اگرچه هر کنترلی عملکرد منحصر به فرد خود را دارد، طبقه بندی آنها بر اساس رفتار و مشخصات مشابه

امکان پذیر است.

RadioButton و CheckBox ،Button • انواع دکمه برای شروع یک عمل یا یک انتخاب بکار م ی روند و شامل

گروه بندی می شوند. GroupBox یا Panel هستند. اغلب بوسیله یک کنترل

می تواند برای نگهداری یک خط متن یا کل یک سند بکار رو د . متدهای متعددی برای جستجوی متن TextBox •

کادر و تعیین متن انتخاب شده در دسترس است.

برای تعیین محل و اندازه تصویر در SizeMode برای نگه داشتن تصاویر است و یک خصوصیت PictureBox •

کادر عکس وجود دارد.

داده ها را در یک فرمت متنی ComboBox و ListBox . • چندین کنترل برای نمایش لیستی از داد ه ها وجود دارند

ساده نمایش می دهند. با این وجود، ممکن است داده اصلی یک شی باشد که چندین خصوصیت دارد.

برای نمایش داده ها بوسیله یک رابطه سلسله مراتبی مفید هستند. ListView و TreeView •

می تواند داده ها را با چندین نما همچون شبکه ای و آیکونی نمایش دهند. ListView •

یک تشبیه درخت را نشان م یدهد که داده ها بصورت گر ههای پدر و فرزند نمایش داده م یشوند. TreeView •

بیشتر این کنتر ل ها عملیات کشیدن و انداختن را پشتیبانی م ی کنند که عمل کپی یا انتقال داد هها از یک کنترل به

عمل را شروع م ی کند و داد ه ها و تأثیرات DoDragDrop کنترل دیگر را ساده م ی سازد. کنترل مبداً ب ا فراخوانی متد

ممکن را به کنترل هدف رد م یکند.

ایجاد کنتر ل های سفارشی را مجاز داشته اس ت . آنها NET. ، برای برنامه هایی که کنتر ل های غیراستاندارد نیاز دارند

می توانند از ابتدا ایجاد شوند یا از یک کنترل موجود م شتق شوند یا ترکیبی از کنتر ل ها را بصورت یک کنترل

                کاربری ایجاد کنند.

mohsen_mahyar@yahoo.com

 

   + MOHSEN GHASEMI - ٩:۳٦ ‎ق.ظ ; ۱۳۸٩/٤/۱٩