最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中Winform 實現(xiàn)Ajax效果自定義按鈕

 更新時間:2017年12月19日 08:53:56   作者:數(shù)據(jù)酷軟件  
這篇文章主要介紹了C#中Winform 實現(xiàn)Ajax效果自定義按鈕的相關資料,需要的朋友可以參考下

技術(shù)看點

  1.  WinForm自定義控件的使用
  2. 自定義控件gif動畫的播放

需求及效果

又來一波 C# GDI自定義控件show 。這個控件已經(jīng)使用幾年了,最近找出來重構(gòu)一下。原來是沒有邊框的,那么導致導航的功能不是很突出。本來想加個效果:在執(zhí)行單擊時顯示Loading動畫,在執(zhí)行完單擊事件后恢復原樣。這就是網(wǎng)頁里見到的局部刷新,Ajax常用的場景。需求來自幾年前一個智能儲物柜項目,人機界面有個美工設計好的效果圖,為了省事和通用,需要一個透明的按鈕來實現(xiàn)導航的任務。就是控件只是設計時可見,運行時不可見。

 

關鍵點說明

1)、GraphicsPath實現(xiàn)矩形的圓角羽化處理

 using (GraphicsPath path = new GraphicsPath())
   {
    #region 羽化,圓角處理
    path.StartFigure();
    path.AddArc(new Rectangle(new Point(rect.X, rect.Y), new Size(2 * Radius, 2 * Radius)), 180, 90);
    path.AddLine(new Point(rect.X + Radius, rect.Y), new Point(rect.Right - Radius, rect.Y));
    path.AddArc(new Rectangle(new Point(rect.Right - 2 * Radius, rect.Y), new Size(2 * Radius, 2 * Radius)), 270, 90);
    path.AddLine(new Point(rect.Right, rect.Y + Radius), new Point(rect.Right, rect.Bottom - Radius));
    path.AddArc(new Rectangle(new Point(rect.Right - 2 * Radius, rect.Bottom - 2 * Radius), new Size(2 * Radius, 2 * Radius)), 0, 90);
    path.AddLine(new Point(rect.Right - Radius, rect.Bottom), new Point(rect.X + Radius, rect.Bottom));
    path.AddArc(new Rectangle(new Point(rect.X, rect.Bottom - 2 * Radius), new Size(2 * Radius, 2 * Radius)), 90, 90);
    path.AddLine(new Point(rect.X, rect.Bottom - Radius), new Point(rect.X, rect.Y + Radius));
    path.CloseFigure();
    #endregion 
    
要點就是畫幾段弧線和矩形連接起來。透明就是用了Color.FromArgb加上透明度,然后填充GraphicsPath形成透明區(qū)域。
g.FillPath(new SolidBrush(Color.FromArgb(153, BackColor)), path);
2)、單窗體應用如何模塊化 

窗體只有一個,但操作界面好多個,由于是無人值守的應用。那么老是切換窗體操作是非常不方便的。工作區(qū)域是一個容器Panel,把每個操作界面定義成一個Panel作為只容器。

 public partial class DepositBizPanel : UserControl
 {
  private BackgroundStyle backgroundStyle = BackgroundStyle.Green;
  /// <summary>
  /// 主題風格
  /// </summary>
  public BackgroundStyle BackgroundStyle
  {
   get { return backgroundStyle; }
   set
   {
    backgroundStyle = value;
    switch (value)
    {
     case GreenlandExpressBox.BackgroundStyle.Blue:
      BackgroundImage = Properties.Resources.jbblue;
      break;
     case GreenlandExpressBox.BackgroundStyle.Orange:
      BackgroundImage = Properties.Resources.jborange;
      break;
     case GreenlandExpressBox.BackgroundStyle.Green:
      BackgroundImage = Properties.Resources.jbgreen;
      break;
    }
    Invalidate();
   }
  }

  public Panel ParentPanel
  {
   get;
   set;
  }

  public Bitmap QR_Barcode
  {
   get { return (Bitmap)pbxBarcode.Image; }
   set { pbxBarcode.Image = value; }
  }

  public DialogResult PanelDiagResult
  {
   get;
   set;
  }

  public DepositBizPanel(Panel parent, Bitmap barcode, BackgroundStyle style)
  {
   InitializeComponent();
   DoubleBuffered = true;
   ParentPanel = parent;
   QR_Barcode = barcode;
   BackgroundStyle = style;
  }  

  private void btnback_Click(object sender, EventArgs e)
  {
   foreach (Control panel in ParentPanel.Controls)
   {
    if (panel is DepositBizPanel)
    {
     ParentPanel.Controls.Remove(panel);
     PanelDiagResult = DialogResult.Cancel;
     break;
    }
   }
  }

  private void btnprocessnext_Click(object sender, EventArgs e)
  {
   foreach (Control panel in ParentPanel.Controls)
   {
    if (panel is DepositBizPanel)
    {
     ParentPanel.Controls.Remove(panel);
     PanelDiagResult = DialogResult.OK;
     break;
    }
   }
  }
 }
人機操作界面例子

 3)、控件播放gif動畫

private void BeginAnimate()
  {
   if (m_AnimateImage == null)
    return;
   if (ImageAnimator.CanAnimate(m_AnimateImage))
   {
    //當gif動畫每隔一定時間后,都會變換一幀,那么就會觸發(fā)一事件, 
    //該方法就是將當前image每變換一幀時,都會調(diào)用當前這個委托所關聯(lián)的方法。 
    ImageAnimator.Animate(m_AnimateImage, m_evthdlAnimator);
   }
  }
  private void StopAnimate()
  {
   if (m_AnimateImage == null)
    return;
   try
   {
    if (ImageAnimator.CanAnimate(m_AnimateImage))
    {
     ImageAnimator.StopAnimate(m_AnimateImage, m_evthdlAnimator);
    }
   }
   finally
   {
    m_IsExecuted = false;
   }
  }
  private void UpdateImage()
  {
   if (m_AnimateImage == null)
    return;
   if (ImageAnimator.CanAnimate(m_AnimateImage))
   {
    //獲得當前gif動畫的下一步需要渲染的幀,當下一步任何對當前gif動畫的操作都是對該幀進行操作) 
    ImageAnimator.UpdateFrames(m_AnimateImage);
   }
  }
  private void OnImageAnimate(Object sender, EventArgs e)
  {
   Invalidate();
  }
  protected override void OnLoad(EventArgs e)
  {
   base.OnLoad(e);
   string s1 = @"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";
   byte[] buffer = Convert.FromBase64String(s1);
   MemoryStream ms = new MemoryStream(buffer);
   var srcImg = Image.FromStream(ms);
   m_AnimateImage = srcImg;
  }
OnLoad執(zhí)行的操作是從base64字符串里反序列化圖片,就是效果圖中的Loading的gif圖片。這里遇到一個問題:在關閉了MemoryStream之后,會出現(xiàn)“gdi+ 中發(fā)生一般性錯誤”,于是改為不關閉了,控件銷毀之后占用的內(nèi)存就會釋放吧。這是一點隱憂,如果有好的辦法,希望留言告知。

透明按鈕自定義控件全部代碼

第一版自定義按鈕:

/// <summary>
 /// Cool透明自定義按鈕
 /// </summary>
 public partial class CoolTransparentButton : UserControl
 {
  private Size iconSize = new Size(32, 32);
  public Size IconSize
  {
   get
   {
    return iconSize;
   }
   set
   {
    iconSize = value;
    Invalidate();
   }
  }
  private string _ButtonText;
  public string ButtonText
  {
   get { return _ButtonText; }
   set
   {
    _ButtonText = value;
    Invalidate();
   }
  }
  protected Image _IconImage;
  public Image IconImage
  {
   get
   {
    return _IconImage;
   }
   set
   {
    _IconImage = value;
    Invalidate();
   }
  }
  private bool _FocseActived = false;
  private Color _BorderColor = Color.White;
  public Color BorderColor
  {
   get
   {
    return _BorderColor;
   }
   set
   {
    _BorderColor = value;
    Invalidate();
   }
  }
  private int _Radius = 12;
  public int Radius
  {
   get
   {
    return _Radius;
   }
   set
   {
    _Radius = value;
    Invalidate();
   }
  }
  private bool ifDrawBorderWhenLostFocse = true;
  /// <summary>
  /// 失去焦點是否畫邊框
  /// </summary>
  public bool IfDrawBorderWhenLostFocse
  {
   get
   {
    return ifDrawBorderWhenLostFocse;
   }
   set
   {
    ifDrawBorderWhenLostFocse = value;
    Invalidate();
   }
  }
  /// <summary>
  /// 是否處于激活狀態(tài)(焦點)
  /// </summary>
  public bool FocseActived
  {
   get { return _FocseActived; }
   set
   {
    _FocseActived = value;
    Invalidate();
   }
  }   
  public CoolTransparentButton()
  {
   DoubleBuffered = true;
   BackColor = Color.Transparent;
   SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
   SetStyle(ControlStyles.Opaque, false);
   UpdateStyles(); 
  }
  protected override void OnPaint(PaintEventArgs e)
  {
   var rect = ClientRectangle;
   rect.Inflate(-1, -1);
   Graphics g = e.Graphics;
   g.SmoothingMode = SmoothingMode.HighQuality;
   using (GraphicsPath path = new GraphicsPath())
   {
    #region 羽化,圓角處理
    path.StartFigure();
    path.AddArc(new Rectangle(new Point(rect.X, rect.Y), new Size(2 * Radius, 2 * Radius)), 180, 90);
    path.AddLine(new Point(rect.X + Radius, rect.Y), new Point(rect.Right - Radius, rect.Y));
    path.AddArc(new Rectangle(new Point(rect.Right - 2 * Radius, rect.Y), new Size(2 * Radius, 2 * Radius)), 270, 90);
    path.AddLine(new Point(rect.Right, rect.Y + Radius), new Point(rect.Right, rect.Bottom - Radius));
    path.AddArc(new Rectangle(new Point(rect.Right - 2 * Radius, rect.Bottom - 2 * Radius), new Size(2 * Radius, 2 * Radius)), 0, 90);
    path.AddLine(new Point(rect.Right - Radius, rect.Bottom), new Point(rect.X + Radius, rect.Bottom));
    path.AddArc(new Rectangle(new Point(rect.X, rect.Bottom - 2 * Radius), new Size(2 * Radius, 2 * Radius)), 90, 90);
    path.AddLine(new Point(rect.X, rect.Bottom - Radius), new Point(rect.X, rect.Y + Radius));
    path.CloseFigure();
    #endregion 
    if (!FocseActived)
    {
     if (ifDrawBorderWhenLostFocse)
      g.DrawPath(new Pen(Color.Gray, 1), path);
     g.FillPath(new SolidBrush(Color.FromArgb(66, BackColor)), path);
    }
    else
    {
     g.DrawPath(new Pen(BorderColor, 1), path);
     rect.Inflate(-1, -1);
     g.FillPath(new SolidBrush(Color.FromArgb(153, BackColor)), path);
    }
    #region 畫文本
    g.SmoothingMode = SmoothingMode.AntiAlias;
    if (IconImage != null)
    {
     Rectangle rc = new Rectangle((Width - 32) / 2, 16, IconSize.Width, IconSize.Height);
     g.DrawImage(IconImage, rc);
    }
    if (!string.IsNullOrEmpty(ButtonText))
    {
     using (StringFormat f = new StringFormat())
     {
      Rectangle rectTxt = new Rectangle(0, (Height - 18) / 2, Width, 36);
      f.Alignment = StringAlignment.Center;// 水平居中對齊 
      f.LineAlignment = StringAlignment.Center; // 垂直居中對齊 
      f.FormatFlags = StringFormatFlags.NoWrap;// 設置為單行文本 
      SolidBrush fb = new SolidBrush(this.ForeColor); // 繪制文本 
      e.Graphics.DrawString(ButtonText, new Font("微軟雅黑", 16F, FontStyle.Bold), fb, rectTxt, f);
     }
    }
    #endregion 
   }
  }
  protected override void OnMouseHover(EventArgs e)
  {
   FocseActived = true;
  }
  protected override void OnMouseLeave(EventArgs e)
  {
   FocseActived = false;
  }
  protected override void OnEnter(EventArgs e)
  {
   FocseActived = true;
  }
  protected override void OnLeave(EventArgs e)
  {
   FocseActived = false;
  } 
 }
第二版自定義按鈕:
/// <summary>
 /// 自定義透明自定義按鈕,模仿實現(xiàn)了網(wǎng)頁元素的Ajax效果
 /// </summary>
 public partial class AjaxTransparentButton : UserControl
 {
  private Size iconSize = new Size(32, 32);
  public Size IconSize
  {
   get
   {
    return iconSize;
   }
   set
   {
    iconSize = value;
    Invalidate();
   }
  }
  private string _ButtonText;
  public string ButtonText
  {
   get { return _ButtonText; }
   set
   {
    _ButtonText = value;
    Invalidate();
   }
  }
  protected Image _IconImage;
  public Image IconImage
  {
   get
   {
    return _IconImage;
   }
   set
   {
    _IconImage = value;
    Invalidate();
   }
  }
  private bool _FocseActived = false;
  private Color _BorderColor = Color.White;
  public Color BorderColor
  {
   get
   {
    return _BorderColor;
   }
   set
   {
    _BorderColor = value;
    Invalidate();
   }
  }
  private int _Radius = 12;
  public int Radius
  {
   get
   {
    return _Radius;
   }
   set
   {
    _Radius = value;
    Invalidate();
   }
  }
  private bool ifDrawBorderWhenLostFocse = true;
  /// <summary>
  /// 失去焦點是否畫邊框
  /// </summary>
  public bool IfDrawBorderWhenLostFocse
  {
   get
   {
    return ifDrawBorderWhenLostFocse;
   }
   set
   {
    ifDrawBorderWhenLostFocse = value;
    Invalidate();
   }
  }
  /// <summary>
  /// 是否處于激活狀態(tài)(焦點)
  /// </summary>
  public bool FocseActived
  {
   get { return _FocseActived; }
   set
   {
    _FocseActived = value;
    Invalidate();
   }
  }
  private Image m_AnimateImage = null;
  private EventHandler m_evthdlAnimator = null;
  private bool m_IsExecuted = false;
  public AjaxTransparentButton()
  {
   BackColor = Color.Transparent;
   SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
   SetStyle(ControlStyles.Opaque, false);
   UpdateStyles();
   m_evthdlAnimator = new EventHandler(OnImageAnimate);
  }
  protected override void OnPaint(PaintEventArgs e)
  {
   var rect = ClientRectangle;
   rect.Inflate(-1, -1);
   Graphics g = e.Graphics;
   g.SmoothingMode = SmoothingMode.HighQuality;
   using (GraphicsPath path = new GraphicsPath())
   {
    #region 羽化,圓角處理
    path.StartFigure();
    path.AddArc(new Rectangle(new Point(rect.X, rect.Y), new Size(2 * Radius, 2 * Radius)), 180, 90);
    path.AddLine(new Point(rect.X + Radius, rect.Y), new Point(rect.Right - Radius, rect.Y));
    path.AddArc(new Rectangle(new Point(rect.Right - 2 * Radius, rect.Y), new Size(2 * Radius, 2 * Radius)), 270, 90);
    path.AddLine(new Point(rect.Right, rect.Y + Radius), new Point(rect.Right, rect.Bottom - Radius));
    path.AddArc(new Rectangle(new Point(rect.Right - 2 * Radius, rect.Bottom - 2 * Radius), new Size(2 * Radius, 2 * Radius)), 0, 90);
    path.AddLine(new Point(rect.Right - Radius, rect.Bottom), new Point(rect.X + Radius, rect.Bottom));
    path.AddArc(new Rectangle(new Point(rect.X, rect.Bottom - 2 * Radius), new Size(2 * Radius, 2 * Radius)), 90, 90);
    path.AddLine(new Point(rect.X, rect.Bottom - Radius), new Point(rect.X, rect.Y + Radius));
    path.CloseFigure();
    #endregion 
    if (!FocseActived)
    {
     if (ifDrawBorderWhenLostFocse)
      g.DrawPath(new Pen(Color.Gray, 1), path);
     g.FillPath(new SolidBrush(Color.FromArgb(66, BackColor)), path);
    }
    else
    {
     g.DrawPath(new Pen(BorderColor, 1), path);
     rect.Inflate(-1, -1);
     g.FillPath(new SolidBrush(Color.FromArgb(153, BackColor)), path);
    }
    #region 畫文本
    g.SmoothingMode = SmoothingMode.AntiAlias;
    if (IconImage != null)
    {
     Rectangle rc = new Rectangle((Width - 32) / 2, 16, IconSize.Width, IconSize.Height);
     g.DrawImage(IconImage, rc);
    }
    if (!string.IsNullOrEmpty(ButtonText))
    {
     using (StringFormat f = new StringFormat())
     {
      Rectangle rectTxt = new Rectangle(0, (Height - 18) / 2, Width, 36);
      f.Alignment = StringAlignment.Center;// 水平居中對齊 
      f.LineAlignment = StringAlignment.Center; // 垂直居中對齊 
      f.FormatFlags = StringFormatFlags.NoWrap;// 設置為單行文本 
      SolidBrush fb = new SolidBrush(this.ForeColor); // 繪制文本 
      e.Graphics.DrawString(ButtonText, new Font("微軟雅黑", 16F, FontStyle.Bold), fb, rectTxt, f);
     }
    }
    if (m_AnimateImage != null)
    {
     Rectangle rectGif = new Rectangle((Width - 24) / 2, (Height - 16) / 2 - 8, 32, 32);
     if (m_IsExecuted)
     {
      UpdateImage();
      e.Graphics.DrawImage(m_AnimateImage, rectGif);
     }
     else
     {
      e.Graphics.FillRectangle(new SolidBrush(Color.Transparent), rectGif);
     }
    }
    #endregion 
   }
  }
  protected override void OnMouseHover(EventArgs e)
  {
   FocseActived = true;
  }
  protected override void OnMouseLeave(EventArgs e)
  {
   FocseActived = false;
  }
  protected override void OnEnter(EventArgs e)
  {
   FocseActived = true;
  }
  protected override void OnLeave(EventArgs e)
  {
   FocseActived = false;
  }
  private void BeginAnimate()
  {
   if (m_AnimateImage == null)
    return;
   if (ImageAnimator.CanAnimate(m_AnimateImage))
   {
    //當gif動畫每隔一定時間后,都會變換一幀,那么就會觸發(fā)一事件, 
    //該方法就是將當前image每變換一幀時,都會調(diào)用當前這個委托所關聯(lián)的方法。 
    ImageAnimator.Animate(m_AnimateImage, m_evthdlAnimator);
   }
  }
  private void StopAnimate()
  {
   if (m_AnimateImage == null)
    return;
   try
   {
    if (ImageAnimator.CanAnimate(m_AnimateImage))
    {
     ImageAnimator.StopAnimate(m_AnimateImage, m_evthdlAnimator);
    }
   }
   finally
   {
    m_IsExecuted = false;
   }
  }
  private void UpdateImage()
  {
   if (m_AnimateImage == null)
    return;
   if (ImageAnimator.CanAnimate(m_AnimateImage))
   {
    //獲得當前gif動畫的下一步需要渲染的幀,當下一步任何對當前gif動畫的操作都是對該幀進行操作) 
    ImageAnimator.UpdateFrames(m_AnimateImage);
   }
  }
  private void OnImageAnimate(Object sender, EventArgs e)
  {
   Invalidate();
  }
  protected override void OnLoad(EventArgs e)
  {
   base.OnLoad(e);
   string s1 = @"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";
   byte[] buffer = Convert.FromBase64String(s1);
   MemoryStream ms = new MemoryStream(buffer);
   var srcImg = Image.FromStream(ms);
   m_AnimateImage = srcImg;
  }
  protected override void OnClick(EventArgs e)
  {
   if (m_IsExecuted)
    return;
   Action clickTask = () =>
   {
    m_IsExecuted = true;
    BeginAnimate();
    base.OnClick(e);
    Invalidate();
   };
   //異步執(zhí)行單擊事件
   clickTask.BeginInvoke((result) =>
   {
    clickTask.EndInvoke(result);
    m_IsExecuted = false;
    StopAnimate();
   }, null);
  }
  protected override void Dispose(bool disposing)
  {
   base.Dispose(disposing);
   if (m_AnimateImage != null)
   {
    try
    {
     StopAnimate();
    }
    finally
    {
     m_AnimateImage.Dispose();
     m_evthdlAnimator = null;
    }
   }
  }
  protected override void OnKeyDown(KeyEventArgs e)
  {
   base.OnKeyDown(e);
   if (e.KeyCode == Keys.Enter)
   {
    OnClick(e);
   }
  }
 }
注釋不是很多,源碼如有需要拿走不謝

相關文章

  • 詳解C#中有趣的?SourceGenerator生成器

    詳解C#中有趣的?SourceGenerator生成器

    源生成器是Roslyn編譯器的一個強大特性,允許開發(fā)者在編譯階段注入自定義代碼,本文通過一個實例探究源生成器的使用方法及其在AOT場景的應用,并利用WinDbg工具深入分析Roslyn的內(nèi)部機制
    2024-10-10
  • 避免在C#循環(huán)中使用await的方法小結(jié)

    避免在C#循環(huán)中使用await的方法小結(jié)

    在C#中,異步編程因其能夠提升應用程序性能和響應能力而變得越來越流行,async和await關鍵字使得編寫異步代碼變得更加容易,但如果使用不當,它們也可能引入一些陷阱,所以本文我們將探討為什么應該避免在C#循環(huán)中使用await,并討論一些更高效地處理異步操作的替代方法
    2024-09-09
  • c# 修改windows中賬戶的用戶名和密碼

    c# 修改windows中賬戶的用戶名和密碼

    這篇文章主要介紹了c# 改變windows中賬戶的用戶名和密碼,幫助大家更好的理解和學習C#,感興趣的朋友可以了解下
    2020-11-11
  • C# 中的委托與事件機制詳解

    C# 中的委托與事件機制詳解

    本文詳細介紹了C#中委托和事件的概念、使用方法和應用場景,包括委托定義、匿名方法、Lambda表達式、事件機制和多播委托的詳細說明,委托作為類型安全的函數(shù)指針,文章還探討了如何通過匿名方法和Lambda表達式簡化委托的使用,以及多播委托在事件處理中的應用
    2024-10-10
  • C#調(diào)用FFmpeg操作音視頻的實現(xiàn)示例

    C#調(diào)用FFmpeg操作音視頻的實現(xiàn)示例

    本文主要介紹了C#調(diào)用FFmpeg操作音視頻的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • c#基礎系列之值類型和引用類型的深入理解

    c#基礎系列之值類型和引用類型的深入理解

    這篇文章主要給大家介紹了關于c#基礎系列之值類型和引用類型的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • C#實現(xiàn)文件上傳與下載功能實例

    C#實現(xiàn)文件上傳與下載功能實例

    本篇文章主要介紹了C#實現(xiàn)文件上傳與下載,這里整理了詳細的代碼,有需要的小伙伴可以參考下。
    2016-12-12
  • c#中虛函數(shù)的相關使用方法

    c#中虛函數(shù)的相關使用方法

    若一個實例方法聲明前帶有virtual關鍵字,那么這個方法就是虛方法。
    2013-02-02
  • 在Winform程序中使用Spire.Pdf實現(xiàn)頁面添加印章功能的實現(xiàn)

    在Winform程序中使用Spire.Pdf實現(xiàn)頁面添加印章功能的實現(xiàn)

    這篇文章主要介紹了在Winform程序中使用Spire.Pdf實現(xiàn)頁面添加印章功能的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • C#中當前時間轉(zhuǎn)為時間戳的3個方法

    C#中當前時間轉(zhuǎn)為時間戳的3個方法

    在計算機應用世界里,無論是為了記錄事件的發(fā)生時間、保障數(shù)據(jù)一致性還是提升安全性,時間戳都是不可或缺的重要工具,下面我們就來看看C#中轉(zhuǎn)換當前時間為時間戳有哪些方法吧
    2024-12-12

最新評論

山东省| 漠河县| 饶平县| 喀喇| 苏尼特右旗| 湖南省| 依兰县| 中牟县| 永泰县| 威信县| 平和县| 泌阳县| 新津县| 安宁市| 田东县| 论坛| 读书| 古交市| 广德县| 屏南县| 横峰县| 高唐县| 宝兴县| 南部县| 罗山县| 临江市| 玛沁县| 轮台县| 吐鲁番市| 通化市| 民县| 门源| 门头沟区| 德钦县| 全南县| 安顺市| 广灵县| 象山县| 那坡县| 罗甸县| 漳浦县|