پیشنهادها
اشتراکها
5 قانون طراحی REST
اشتراکها
LINQ از مقدماتی تا پیشرفته
اشتراکها
مبانی MVVM و ICommand بهمراه مثال
#Execute VB code via C
می توان از طریق #C، ماکروهای Visual Basic مورد استفادهی در Office را تولید کرد.
static void AddChartButton( Workbook workBook, Worksheet xlWorkSheetNew, Range currentRange, int macroId, int startRow, int endRow, int startCol, int endCol, string buttonImagePath ) { var cell = currentRange.Next; var width = cell.Width; var height = 24; var left = cell.Left; var top = System.Math.Max( cell.Top + cell.Height - height, 0 ); var button = xlWorkSheetNew.Shapes.AddPicture( buttonImagePath, MsoTriState.msoFalse, MsoTriState.msoCTrue, left, top, width, height ); var module = workBook.VBProject.VBComponents.Add( vbext_ComponentType.vbext_ct_StdModule ); module.CodeModule.AddFromString( GetMacro( macroId, startRow, endRow, startCol, endCol ) ); button.OnAction = "Macro" + macroId; } static string GetMacro( int macroId, int startRow, int endRow, int startCol, int endCol ) { var sb = new StringBuilder(); var range = "ActiveSheet.Range(Cells(" + startRow + "," + startCol + "), Cells(" + endRow + "," + endCol + ")).Select"; sb.AppendLine( "Sub Macro" + macroId + "()" ); sb.AppendLine( "On Error Resume Next" ); sb.AppendLine( range ); sb.AppendLine( "ActiveSheet.Shapes.AddChart.Select" ); sb.AppendLine( "ActiveChart.ChartType = xlColumn" ); sb.AppendLine( "ActiveChart.SetSourceData Source:=" + range ); sb.AppendLine( "On Error GoTo 0" ); sb.AppendLine( "End Sub" ); return sb.ToString(); }
و برای استفاده از آن میتوان مانند مثال زیر عمل کرد:
var excelApp = new Microsoft.Office.Interop.Excel.Application(); var fileName = @"C:\Users\Vahid\Desktop\VBA.xlsm"; var workBook = excelApp.Workbooks.Open( fileName ); var sheet = workBook.Sheets[1]; AddChartButton( workBook, sheet, sheet.Range["B1"], 1231, 1, 10, 1, 2, @"C:\Users\Vahid\Desktop\BarChart.png"); excelApp.DisplayAlerts = false; workBook.Close( true, fileName );
خروجی مثال بالا
نکته: در صورتیکه بعد از اجرای برنامه، خطای " programmatic access to visual basic project is not trusted" رخ داد از این طریق میتوانید مشکل را حل کنید.
File -> Options -> Trust Center -> Trust Center Settings -> Macro Settings -> Trust Access to the VBA Project object model
volatile
کلمه کلیدی volatile نشان میدهد که یک فیلد ممکن است توسط چندین thread به صورت همزمان تغییر کند. فیلدهایی که به عنوان volatile تعریف میشوند، شامل بهینه سازی کامپایلر برای دسترسی از طریق تنها یک thread قرار نمیگیرند و بروزرسانی مقدار فعلی این فیلد را در تمامی زمانها، تضمین میکند.
class Program { volatile bool _shouldPartyContinue = true; static void Main() { var firstDimension = new Program(); var secondDimension = new Thread( firstDimension.StartPartyInAnotherDimension ); secondDimension.Start( firstDimension ); Thread.Sleep( 5000 ); firstDimension._shouldPartyContinue = false; Console.WriteLine( "Party Finish" ); } void StartPartyInAnotherDimension( object input ) { var currentDimensionInput = (Program)input; Console.WriteLine( "let the party begin" ); while ( currentDimensionInput._shouldPartyContinue ) {} Console.WriteLine( "Party ends: (" ); } }
نکته: اگر متغیر shouldPartyContinue به وسیله volatile علامت گذاری نشده بود، برنامه در حالت Release (که گزینه Optimize code تیک داشته باشد) هیچگاه به پایان نمیرسید.
::global
وقتی که یک عضو توسط موجودیت دیگری با همان نام مخفی شده باشد، با استفاده از کلمه کلیدی ::global (فضای نام سراسری) قابلیت دسترسی به آن امکان پذیر میشود.
class Program { public static void Main(string[] args) { Console.WriteLine( Number ); // Error global::System.Console.WriteLine( "Console: " + Console ); //OK } public class System { } // Define a constant called ‘Console’ to cause more problems. const int Console = 7; const int Number = 67; }
DebuggerDisplayAttribute
با استفاده از DebuggerDisplayAttribute میتوانید نحوه نمایش یک فیلد یا یک کلاس را در پنجره متغیر دیباگر مشخص کنید.
[DebuggerDisplay( "{DebuggerDisplay}" )] public class DebuggerDisplayTest { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } [DebuggerBrowsable( DebuggerBrowsableState.Never )] string DebuggerDisplay => $"{FirstName} {LastName} {Age} years old"; }
و بعد از استفادهی از آن، خروجی زیر بدست میآید:
همچنین شما میتوانید عبارات مختلفی را به صورت مستقیم در این attribute استفاده کنید.
[DebuggerDisplay( "Age {Age > 0 ? Age : 25}" )] public class DebuggerDisplayTest { //... }
اگر مقدار پروپرتی Age بیشتر از 0 باشد، مقدار Age و در غیراینصورت 25 نشان داده میشود.
اشتراکها
31 نکته برای کدنویسی بهتر در سی شارپ
- بله. به سورس اسکریپت زیر مراجعه کنید:
http://userscripts.org/scripts/show/39917
- رپیدشیر به کلاینتهای دانلودی از اکانت پرمیوم استفاده نمیکنند (اکانت پرمیوم از basic authentication استفاده میکنه)، اجازهی بازکردن بیشتر از یک ترد را نمیدهد. مرورگرها هم عموما فقط از یک ترد برای دانلود استفاده میکنند. اگر دانلود منیجر خودتون رو هم به یک ترد محدود کنید مثل مرورگر عمل میکند.
http://userscripts.org/scripts/show/39917
- رپیدشیر به کلاینتهای دانلودی از اکانت پرمیوم استفاده نمیکنند (اکانت پرمیوم از basic authentication استفاده میکنه)، اجازهی بازکردن بیشتر از یک ترد را نمیدهد. مرورگرها هم عموما فقط از یک ترد برای دانلود استفاده میکنند. اگر دانلود منیجر خودتون رو هم به یک ترد محدود کنید مثل مرورگر عمل میکند.