jQuery("#list").trigger("reloadGrid");
با سلام و خسته نباشید من یه مشکلی داشتم میخواستم در صورت امکان راهنمایی نمایید :
توی یه صفحه میخوام لود شدن دادههای این گرید با رویداد کلیک یه دکمه اتفاق بیفته یه مقدار سرچ هم زدم که تقریبا همشون میگفتن توی رویداد کلیک بنویسم :
اما با این هم جواب نداد و اصلا ActionMethod فراخوانی نمیشه ممنون میشم راهنمایی نمایید
نظرات مطالب
فارسی نویسی و iTextSharp
با سلام ، من کد زیر رو نوشتم
آیا امکانش هست که ما به جای اینکه بیایم در هر Cell کد زیر را بنویسیم یک بار برای کد جدول اینو تعریف کنیم؟
چون اگه بخواهیم کدهای مربوط به تنظیم فوت رو برای هر Cell بنویسیم یه خورده کدها زیاد میشه.
ممنون میشم راهنمایی کنید
مرسی
var m = new ITModel.ITModelContainer(); var list = (from pp in m.PERSONNELs select pp).ToList(); string pdfpath = Server.MapPath("PDFs"); using (var pdfDoc = new Document(PageSize.A4)) { var pdfWriter = PdfWriter.GetInstance(pdfDoc, new FileStream(pdfpath + "/Personnel2.pdf", FileMode.Create)); pdfDoc.Open(); var fontPath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\tahoma.ttf"; var baseFont = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); var tahomaFont = new Font(baseFont, 10, Font.NORMAL, BaseColor.BLACK); float[] widths = new float[] { 1f, 2f }; PdfPTable table = new PdfPTable(2) { TotalWidth = 216f, LockedWidth = true, HorizontalAlignment = 0, SpacingBefore = 20f, SpacingAfter = 30f }; table.SetWidths(widths); PdfPCell cell = new PdfPCell(new Phrase("لیست پرسنل", tahomaFont)) { RunDirection = PdfWriter.RUN_DIRECTION_RTL, Colspan = 2, Border = 0, HorizontalAlignment = 1 }; table.AddCell(cell); foreach (var item in list) { PdfPCell cell2 = new PdfPCell(new Phrase(item.PERSON_ID.ToString(), tahomaFont)) { RunDirection = PdfWriter.RUN_DIRECTION_RTL }; PdfPCell cell3 = new PdfPCell(new Phrase(item.FIRST_NAME + " " + item.LAST_NAME, tahomaFont)) { RunDirection = PdfWriter.RUN_DIRECTION_RTL }; table.AddCell(cell2); table.AddCell(cell3); } pdfDoc.Add(table); }
{ RunDirection = PdfWriter.RUN_DIRECTION_RTL };
ممنون میشم راهنمایی کنید
مرسی
امکان داشتن اعضای static abstract در اینترفیسها شاید عجیب بهنظر برسد یا حتی غیرضروری؛ اما در C# 11، پایهی قابلیت جدیدی به نام «ریاضیات جنریک» شدهاست. به همین جهت در ابتدا نیاز است با اعضای static abstract آشنا شد و در قسمتی دیگر به «ریاضیات جنریک» پرداخت.
مثالی جهت توضیح علت نیاز به اعضای static abstract در اینترفیسها
فرض کنید قصد داریم حاصل جمع اعضای یک آرایهی int را محاسبه کنیم:
روش متداول اینکار را در اینجا ملاحظه میکنید که حلقهای بر روی عناصر آرایه، جهت یافتن حاصل جمع آنها تشکیل شدهاست. اکنون فرض کنید بجای آرایهای که در متد Test استفاده شده، از آرایهی زیر استفاده شود:
اینبار با خطای زیر متوقف میشویم:
عنوان میکند که آرایهی مدنظر از نوع []double تشخیص داده شدهاست و متد AddAll، تنها آرایههای از نوع int را قبول میکند. در جهت رفع این مشکل شاید بهتر باشد نمونهی جنریک متد AddAll را ایجاد کنیم، تا بتوان انواع و اقسام نوعهای ممکن را به آن ارسال کرد:
اما اینکار میسر نیست. چون زمانیکه از T استفاده میشود، مفهوم و امکان وجود «عدد صفر» در آن نوع، مشخص نیست. یک روش حل این مشکل، مقید و محدود کردن نوع T است. برای مثال عنوان کنیم که T، عددی است و از نوع INumber (فرضی/خیالی) است و این INumber فرضی، به همراه مفهوم عدد صفر هم هست. یعنی اولین سطر بدنهی متد AddAll را باید بتوان به صورت زیر بازنویسی کرد:
یعنی باید بتوان از طریق یک «نوع» عمومی مانند T (نه وهلهای/نمونهای/instance ای از آن نوع؛ دقیقا خود آن نوع) به خاصیت Zero آن نوع، دسترسی یافت و آن خاصیت هم باید از نوع استاتیک باشد و چون تا C# 10 و دات نت 6، چنین امکانی مهیا نشده بود (البته در حالت preview قرار داشت)، تنها راه ممکن، تهیهی یک نمونهی جدید double متد AddAll است/بود.
در C# 11 و دات نت 7، با معرفی اینترفیس جدید INumber، میتوان قید <where T : INumber<T را به T اعمال کرد (مانند نمونهی زیر) و همچنین با استفاده از اعضای static abstract این اینترفیس، به مقدار T.Zero هم دسترسی یافت و اینبار قطعه کد زیر، بدون مشکل در C# 11 کامپایل میشود:
اگر به تعاریف INumber جدید مراجعه کنیم، نه فقط به خواص abstract static جدیدی میرسیم (که امکان دسترسی به T.Zero را میسر کردهاند)،
بلکه امکان تعریف اپراتورهای abstract static هم میسر شدهاند (به همین جهت است که در کدهای فوق سطر result += value، هنوز هم کار میکند):
مثال دیگری از کاربرد اعضای abstract static در اینترفیسها
فرض کنید اینترفیس ISport را به همراه دو پیاده سازی از آن، به صورت زیر تعریف کردهایم:
اکنون جهت کار با متد IsTeamSport و تعریف جنریک این متد، میتوان به صورت متداول زیر عمل کرد که در آن T، مقید به ISport شدهاست:
برای کار با آن هم باید حتما نمونهای از ()new Football و یا ()new Swimming را به آن ارسال کرد:
سؤال: آیا با توجه به مشخص بودن و محدود بودن نوع T، میتوان با حذف پارامتر T sport، به متد IsTeamSport اینترفیس ISport دسترسی یافت؟ یعنی تعریف متد Display را طوری تغییر داد تا دیگر نیاز به نمونه سازی ()new Football نداشته باشد. همینقدر که نوع Football مشخص بود، بتوان متد IsTeamSport آنرا فراخوانی کرد.
پاسخ: تا پیشاز C# 11 یکی از روشهای انجام اینکار، استفاده از reflection بود. اما در C# 11 با کمک static abstractها میتوان تعاریف این اینترفیس و پیاده سازیهای آنرا به صورت زیر تغییر داد:
تا اینبار جهت دسترسی به متد IsTeamSport،مستقیما بتوان به خود «نوع»، «بدون نیاز به نمونه سازی آن» مراجعه کرد و قطعه کد زیر در C# 11 معتبر است:
مثالی جهت توضیح علت نیاز به اعضای static abstract در اینترفیسها
فرض کنید قصد داریم حاصل جمع اعضای یک آرایهی int را محاسبه کنیم:
namespace CS11Tests; public class StaticAbstractMembers { public static void Test() { var sum = AddAll(new[] { 1, 2, 3, 4 }); Console.WriteLine(sum); } private static int AddAll(int[] values) { int result = 0; foreach (var value in values) { result += value; } return result; } }
var sum = AddAll(new[] { 1, 2, 3, 4, 0.68 });
Argument 1: cannot convert from 'double[]' to 'int[]' [CS11Tests]csharp(CS1503)
private static T AddAll<T>(T[] values) { T result = 0; foreach (var value in values) { result += value; } return result; }
T result = T.Zero;
در C# 11 و دات نت 7، با معرفی اینترفیس جدید INumber، میتوان قید <where T : INumber<T را به T اعمال کرد (مانند نمونهی زیر) و همچنین با استفاده از اعضای static abstract این اینترفیس، به مقدار T.Zero هم دسترسی یافت و اینبار قطعه کد زیر، بدون مشکل در C# 11 کامپایل میشود:
using System.Numerics; namespace CS11Tests; public class StaticAbstractMembers { public static void Test() { //var sum = AddAll(new[] { 1, 2, 3, 4 }); var sum = AddAll(new[] { 1, 2, 3, 4, 0.68 }); Console.WriteLine(sum); } private static T AddAll<T>(T[] values) where T : INumber<T> { T result = T.Zero; foreach (var value in values) { result += value; } return result; } }
abstract static TSelf One { get; } abstract static TSelf Zero { get; }
abstract static TResult operator +(TSelf left, TOther right);
مثال دیگری از کاربرد اعضای abstract static در اینترفیسها
فرض کنید اینترفیس ISport را به همراه دو پیاده سازی از آن، به صورت زیر تعریف کردهایم:
public interface ISport { bool IsTeamSport(); } public class Swimming : ISport { public bool IsTeamSport() => false; } public class Football : ISport { public bool IsTeamSport() => true; }
public class StaticAbstractMembers { public static void Display<T>(T sport) where T : ISport { Console.WriteLine("Is Team Sport:" + sport.IsTeamSport()); } }
Display(new Football());
پاسخ: تا پیشاز C# 11 یکی از روشهای انجام اینکار، استفاده از reflection بود. اما در C# 11 با کمک static abstractها میتوان تعاریف این اینترفیس و پیاده سازیهای آنرا به صورت زیر تغییر داد:
public interface ISport { static abstract bool IsTeamSport(); } public class Swimming : ISport { public static bool IsTeamSport() => false; } public class Football : ISport { public static bool IsTeamSport() => true; }
public class StaticAbstractMembers { public static void Display<T>() where T : ISport { Console.WriteLine("Is Team Sport:" + T.IsTeamSport()); } }
فرض کنید کدی مانند زیر را در یک کامپوننت داریم و انتظار این است که با کلیک بر روی Section2، به بخش مورد نظر اسکرول شویم:
اما متاسفانه در Blazor Server تا نسخه فعلی آن (نسخه هفت)، این کار ساده به راحتی امکانپذیر نیست. همانطور که ملاحظه میکنید، به دو روش، نویگیشن انجام شدهاست؛ اما هیچیک ما را به هدف نمیرسانند. دلیل این موضوع، رفتار Blazor Server در بارگذاری صفحات میباشد. در حقیقت المانها موقع بارگذاری، هنوز در صفحه وجود ندارند. در واقع ابتدا نیاز است که اتصال SignalR برقرار شود و سپس دادهها از سرور دریافت شوند (مگر در حالت pre-rendered که مشکلات خاص خود را در پی دارد).
سپس کد جاوا اسکریپتی زیر را در جایی قبل از فراخوانی <script src="_framework/blazor.server.js"></script> قرار میدهیم (برای مثال اگر میخواهیم در اکثر صفحات از آن بهره ببریم، آن را در layout.cshtmlـ قرار میدهیم).
حال در هر کامپوننتی که نیاز به استفاده از لنگر (anchor) داریم، به شکل زیر عمل میکنیم:
و پیرو آن، صفحهی موردنظر برای استفاده از لنگر نیز به شکل زیر تغییر خواهد کرد:
@page "/test" <nav> <!-- یک روش --> <a href="#section2">Section2</a> <!-- روش دیگر --> <NavLink href="#section2">Section2</NavLink> </nav> @* ... *@ <h2 id="section2">It's Section2.</h2> @* ... *@
برای انجام این کار دو روش وجود دارد؛ یکی بر پایهی جاوااسکریپت است و دیگری توسط توابع داخلی Blazor JS.
روش جاوااسکریپتی
ابتدا یک کامپوننت را به نام AnchorNavigation ایجاد مینماییم:
@inject IJSRuntime JSRuntime @inject NavigationManager NavigationManager @implements IDisposable @code { protected override void OnInitialized() { NavigationManager.LocationChanged += OnLocationChanged; } protected override async Task OnAfterRenderAsync(bool firstRender) { await ScrollToFragment(); } public void Dispose() { NavigationManager.LocationChanged -= OnLocationChanged; } private async void OnLocationChanged(object sender, LocationChangedEventArgs e) { await ScrollToFragment(); } private async Task ScrollToFragment() { var uri = new Uri(NavigationManager.Uri, UriKind.Absolute); var fragment = uri.Fragment; if (fragment.StartsWith('#')) { // Handle text fragment (https://example.org/#test:~:text=foo) // https://github.com/WICG/scroll-to-text-fragment/ var elementId = fragment.Substring(1); var index = elementId.IndexOf(":~:", StringComparison.Ordinal); if (index > 0) { elementId = elementId.Substring(0, index); } if (!string.IsNullOrEmpty(elementId)) { await JSRuntime.InvokeVoidAsync("BlazorScrollToId", elementId); } } } }
function BlazorScrollToId(id) { const element = document.getElementById(id); if (element instanceof HTMLElement) { element.scrollIntoView({ behavior: "smooth", block: "start", inline: "nearest" }); } }
@page "/" <PageTitle>Index</PageTitle> <a href="#section2"> <h1>Section2</h1> </a> <SurveyPrompt Title="How is Blazor working for you?" /> <div style="height: 2000px"> </div> <div id="section2"> <h2>It's Section2. </h2> </div> <AnchorNavigation />
روش استفاده از توابع داخلی Blazor JS
می توان از ElementReference و FocusAsync که در حقیقت مربوط به خود Blazor JS میباشند استفاده نمود. اینبار کدهای کامپوننت AnchorNavigation را به شکل زیر تغییر میدهیم:
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Rendering; using Microsoft.AspNetCore.Components.Routing; using System.Diagnostics.CodeAnalysis; namespace TestAnchorNavigation; public class AnchorNavigation: ComponentBase, IDisposable { private bool _setFocus; [Inject] private NavigationManager NavManager { get; set; } = default!; [Parameter] public RenderFragment? ChildContent { get; set; } [Parameter] public string? BookmarkName { get; set; } [DisallowNull] public ElementReference? Element { get; private set; } protected override void BuildRenderTree(RenderTreeBuilder builder) { builder.OpenElement(0, "span"); builder.AddAttribute(2, "tabindex", "-1"); builder.AddContent(3, this.ChildContent); builder.AddElementReferenceCapture(4, this.SetReference); builder.CloseElement(); } protected override void OnInitialized() => NavManager.LocationChanged += this.OnLocationChanged; protected override void OnParametersSet() => _setFocus = this.IsMe(); private void SetReference(ElementReference reference) => this.Element = reference; private void OnLocationChanged(object? sender, LocationChangedEventArgs e) { if (this.IsMe()) { _setFocus = true; this.StateHasChanged(); } } protected async override Task OnAfterRenderAsync(bool firstRender) { if (_setFocus) await this.Element!.Value.FocusAsync(false); _setFocus = false; } private bool IsMe() { string? elementId = null; var uri = new Uri(this.NavManager.Uri, UriKind.Absolute); if (uri.Fragment.StartsWith('#')) { elementId = uri.Fragment.Substring(1); return elementId == BookmarkName; } return false; } public void Dispose() => NavManager.LocationChanged -= this.OnLocationChanged; }
@page "/" <PageTitle>Index</PageTitle> <NavLink href="#section2"> <h1>Section2</h1> </NavLink> <SurveyPrompt Title="How is Blazor working for you?" /> <div style="height: 2000px"> </div> <AnchorNavigation BookmarkName="section2"> <h2>It's Section2. </h2> </AnchorNavigation>
اشتراکها
آپلود فایل بوت استرپی
اشتراکها
سری آموزشی مقدمات Typescript
اشتراکها