主頁 > .NET開發 > 反應應用程式中的事件“OnkeyDown”不同步

反應應用程式中的事件“OnkeyDown”不同步

2021-11-09 07:15:41 .NET開發

大家好。我是網路開發的新手。我只是不明白為什么第二次觸發事件“OnKeyDown”。我的任務是在輸入欄位中更改(增加、減少)日期(日、月、年、小時、分鐘、秒)的部分。

應用功能:

  1. 當按下 'ctrl' 'ArrowUp' 按鈕組合時,日期的部分會隨著其他部分的可變而改變。例如,如果當前日期為 31/12/2021 并且您將第 31 天更改為 01,則日期更改為 01/01/2022。
  2. 當按下“ArrowUp”按鈕時,只改變這一部分,日期的其他部分是不可變的。

功能的第一步作業正常,現在我創建第二步。我的問題是當我想通過按第二次觸發的“ArrowUp”事件來增加天數時,這就是不同步的原因。希望我能夠正確解釋。

在沙盒片段中試用我的應用程式

有問題的代碼部分:

增加日期的天數

if (e.key === "ArrowUp") {
      if (
        inputEl.current.selectionStart >= 0 &&
        inputEl.current.selectionStart <= 2 
      ) {
        e.preventDefault();
        let nextMilisec = milisec   86400000;
        setSelection({ start: 0, end: 2 });
        setMilisec(nextMilisec);
        setDate((prevState) => {
          return {
            ...prevState,
            day: new Date(nextMilisec).getDate(),
          };
        });
        cur_date.setDate(day);
        setValue(date_format_unmut);
      }

減少日期的天數

if (
        inputEl.current.selectionStart >= 0 &&
        inputEl.current.selectionStart <= 2 
      ) {
        e.preventDefault();
        let nextMilisec = milisec - 86400000;
        setSelection({ start: 0, end: 2 });
        setMilisec(nextMilisec);
        setDate((prevState) => {
          return {
            ...prevState,
            day: new Date(nextMilisec).getDate(),
          };
        });
        cur_date.setDate(day);
        setValue(date_format_unmut);
      }

完整代碼(對不起,我知道它很多,我需要重構這個爛攤子。)

import React, { useState, useEffect, useRef } from "react";
import styles from "./DataInput.module.css";

const cur_date = new Date();

const def_day = cur_date.getDate();
const def_month = cur_date.getMonth();
const def_year = cur_date.getFullYear();
const def_hour = cur_date.getHours();
const def_minute = cur_date.getMinutes();
const def_seconds = cur_date.getSeconds();

const dayNames = {
  0: "Sunday",
  1: "Monday",
  2: "Tuesday",
  3: "Wednesday",
  4: "Thursday",
  5: "Friday",
  6: "Saturday",
};

const monthNames = {
  0: "January",
  1: "February",
  2: "March",
  3: "April",
  4: "May",
  5: "June",
  6: "July",
  7: "August",
  8: "September",
  9: "October",
  10: "November",
  11: "December",
};

const DataInput = () => {
  const [milisec, setMilisec] = useState(cur_date.valueOf());
  const [date, setDate] = useState({
    day: def_day,
    month: def_month,
    year: def_year,
    hour: def_hour,
    minute: def_minute,
    second: def_seconds,
  });
  const { day, month, year, hour, minute, second } = date;

  const date_format_unmut = `${("0"   day).slice(-2)}/${
    monthNames[month]
  }/${year} ${("0"   hour).slice(-2)}:${("0"   minute).slice(-2)}:${(
    "0"   second
  ).slice(-2)}`;

  const inputEl = useRef();
  const [selection, setSelection] = useState();

  const date_format = cur_date.toLocaleString().split(".");
  const monthIndex =  date_format[1];
  date_format[1] = monthNames[monthIndex - 1];
  let string_date_format = date_format.join("/").replace(",", "");

  const [value, setValue] = useState(string_date_format);

  useEffect(() => {
    if (!selection) return; // prevent running on start
    const { start, end } = selection;
    inputEl.current.focus();
    inputEl.current.setSelectionRange(start, end);
  }, [selection]);

  const keyHandler = (e) => {
    if (e.key === "ArrowUp") {
      if (
        inputEl.current.selectionStart >= 0 &&
        inputEl.current.selectionStart <= 2 
      ) {
        e.preventDefault();
        let nextMilisec = milisec   86400000;
        setSelection({ start: 0, end: 2 });
        setMilisec(nextMilisec);
        setDate((prevState) => {
          return {
            ...prevState,
            day: new Date(nextMilisec).getDate(),
          };
        });
        cur_date.setDate(day);
        setValue(date_format_unmut);
      }
      if (
        inputEl.current.selectionStart >= 3 &&
        inputEl.current.selectionStart <= date_format[1].length   3 
      ) {
        e.preventDefault();
        const newMonth = cur_date.getMonth()   1;
        cur_date.setMonth(newMonth);
        console.log(cur_date);
        setSelection({
          start: 3,
          end: date_format[1].length   3,
        });
        setDate((prevState) => {
          return {
            ...prevState,
            month: cur_date.getMonth() - 1,
          };
        });

        setValue(date_format_unmut);
      }
    }

    if (e.ctrlKey && e.key === "ArrowUp") {
      if (
        inputEl.current.selectionStart >= 0 &&
        inputEl.current.selectionStart <= 1
      ) {
        e.preventDefault();
        setSelection({ start: 0, end: 2 });
        const newDay = cur_date.setDate(cur_date.getDate()   1);
        const increaseDayData = new Date(newDay).toLocaleString().split(".");
        const monthIndex =  increaseDayData[1];
        increaseDayData[1] = monthNames[monthIndex - 1];
        const addDay_date_format = increaseDayData.join("/").replace(",", "");
        setValue(addDay_date_format);
      }
      if (
        inputEl.current.selectionStart >= 3 &&
        inputEl.current.selectionStart <= date_format[1].length   3
      ) {
        const newMonth = cur_date.setMonth(cur_date.getMonth()   1);
        const increaseMonthData = new Date(newMonth)
          .toLocaleString()
          .split(".");
        const monthNumber = increaseMonthData[1];
        setSelection({ start: 3, end: monthNames[monthNumber - 1].length   3 });
        const monthIndex =  increaseMonthData[1];
        increaseMonthData[1] = monthNames[monthIndex - 1];
        const addMonth_date_format = increaseMonthData
          .join("/")
          .replace(",", "");
        setValue(addMonth_date_format);
      }
      if (
        inputEl.current.selectionStart >= date_format[1].length   4 &&
        inputEl.current.selectionStart <= date_format[1].length   8
      ) {
        const newYear = cur_date.setFullYear(cur_date.getFullYear()   1);
        const increaseYearData = new Date(newYear).toLocaleString().split(".");
        setSelection({
          start: date_format[1].length   4,
          end: date_format[1].length   8,
        });
        const monthIndex =  increaseYearData[1];
        increaseYearData[1] = monthNames[monthIndex - 1];
        const addYear_date_format = increaseYearData.join("/").replace(",", "");
        setValue(addYear_date_format);
      }
      if (
        inputEl.current.selectionStart >= date_format[1].length   9 &&
        inputEl.current.selectionStart <= date_format[1].length   11
      ) {
        const newHour = cur_date.setHours(cur_date.getHours()   1);
        const increaseHourData = new Date(newHour).toLocaleString().split(".");
        setSelection({
          start: date_format[1].length   9,
          end: date_format[1].length   11,
        });
        const monthIndex =  increaseHourData[1];
        increaseHourData[1] = monthNames[monthIndex - 1];
        const addHour_date_format = increaseHourData.join("/").replace(",", "");
        setValue(addHour_date_format);
      }
      if (
        inputEl.current.selectionStart >= date_format[1].length   12 &&
        inputEl.current.selectionStart <= date_format[1].length   14
      ) {
        const newMinutes = cur_date.setMinutes(cur_date.getMinutes()   1);
        const increaseMinutesData = new Date(newMinutes)
          .toLocaleString()
          .split(".");
        setSelection({
          start: date_format[1].length   12,
          end: date_format[1].length   14,
        });
        const monthIndex =  increaseMinutesData[1];
        increaseMinutesData[1] = monthNames[monthIndex - 1];
        const addMinutes_date_format = increaseMinutesData
          .join("/")
          .replace(",", "");
        setValue(addMinutes_date_format);
      }
      if (
        inputEl.current.selectionStart >= date_format[1].length   15 &&
        inputEl.current.selectionStart <= date_format[1].length   17
      ) {
        const newSeconds = cur_date.setSeconds(cur_date.getSeconds()   1);
        const increaseSecondsData = new Date(newSeconds)
          .toLocaleString()
          .split(".");
        setSelection({
          start: date_format[1].length   15,
          end: date_format[1].length   17,
        });
        const monthIndex =  increaseSecondsData[1];
        increaseSecondsData[1] = monthNames[monthIndex - 1];
        const addSeconds_date_format = increaseSecondsData
          .join("/")
          .replace(",", "");
        setValue(addSeconds_date_format);
      }
    }
    if (e.key === "ArrowDown") {
      if (
        inputEl.current.selectionStart >= 0 &&
        inputEl.current.selectionStart <= 2 
      ) {
        e.preventDefault();
        let nextMilisec = milisec - 86400000;
        setSelection({ start: 0, end: 2 });
        setMilisec(nextMilisec);
        setDate((prevState) => {
          return {
            ...prevState,
            day: new Date(nextMilisec).getDate(),
          };
        });
        cur_date.setDate(day);
        setValue(date_format_unmut);
      }
    }
    if (e.ctrlKey && e.key === "ArrowDown") {
      e.preventDefault();
      if (
        inputEl.current.selectionStart >= 0 &&
        inputEl.current.selectionStart <= 1
      ) {
        setSelection({ start: 0, end: 2 });
        const newDay = cur_date.setDate(cur_date.getDate() - 1);
        const increaseDayData = new Date(newDay).toLocaleString().split(".");
        const monthIndex =  increaseDayData[1];
        increaseDayData[1] = monthNames[monthIndex - 1];
        const addDay_date_format = increaseDayData.join("/").replace(",", "");
        setValue(addDay_date_format);
      }
      if (
        inputEl.current.selectionStart >= 3 &&
        inputEl.current.selectionStart <= date_format[1].length   3
      ) {
        const newMonth = cur_date.setMonth(cur_date.getMonth() - 1);
        const increaseMonthData = new Date(newMonth)
          .toLocaleString()
          .split(".");
        const monthNumber = increaseMonthData[1];
        setSelection({ start: 3, end: monthNames[monthNumber - 1].length   3 });
        const monthIndex =  increaseMonthData[1];
        increaseMonthData[1] = monthNames[monthIndex - 1];
        const addMonth_date_format = increaseMonthData
          .join("/")
          .replace(",", "");
        setValue(addMonth_date_format);
      }
      if (
        inputEl.current.selectionStart >= date_format[1].length   4 &&
        inputEl.current.selectionStart <= date_format[1].length   8
      ) {
        const newYear = cur_date.setFullYear(cur_date.getFullYear() - 1);
        const increaseYearData = new Date(newYear).toLocaleString().split(".");
        setSelection({
          start: date_format[1].length   4,
          end: date_format[1].length   8,
        });
        const monthIndex =  increaseYearData[1];
        increaseYearData[1] = monthNames[monthIndex - 1];
        const addYear_date_format = increaseYearData.join("/").replace(",", "");
        setValue(addYear_date_format);
      }
      if (
        inputEl.current.selectionStart >= date_format[1].length   9 &&
        inputEl.current.selectionStart <= date_format[1].length   11
      ) {
        const newHour = cur_date.setHours(cur_date.getHours() - 1);
        const increaseHourData = new Date(newHour).toLocaleString().split(".");
        setSelection({
          start: date_format[1].length   9,
          end: date_format[1].length   11,
        });
        const monthIndex =  increaseHourData[1];
        increaseHourData[1] = monthNames[monthIndex - 1];
        const addHour_date_format = increaseHourData.join("/").replace(",", "");
        setValue(addHour_date_format);
      }

      if (
        inputEl.current.selectionStart >= date_format[1].length   12 &&
        inputEl.current.selectionStart <= date_format[1].length   14
      ) {
        const newMinutes = cur_date.setMinutes(cur_date.getMinutes() - 1);
        const increaseMinutesData = new Date(newMinutes)
          .toLocaleString()
          .split(".");
        setSelection({
          start: date_format[1].length   12,
          end: date_format[1].length   14,
        });
        const monthIndex =  increaseMinutesData[1];
        increaseMinutesData[1] = monthNames[monthIndex - 1];
        const addMinutes_date_format = increaseMinutesData
          .join("/")
          .replace(",", "");
        setValue(addMinutes_date_format);
      }
      if (
        inputEl.current.selectionStart >= date_format[1].length   15 &&
        inputEl.current.selectionStart <= date_format[1].length   17
      ) {
        const newSeconds = cur_date.setSeconds(cur_date.getSeconds() - 1);
        const increaseSecondsData = new Date(newSeconds)
          .toLocaleString()
          .split(".");
        setSelection({
          start: date_format[1].length   15,
          end: date_format[1].length   17,
        });
        const monthIndex =  increaseSecondsData[1];
        increaseSecondsData[1] = monthNames[monthIndex - 1];
        const addSeconds_date_format = increaseSecondsData
          .join("/")
          .replace(",", "");
        setValue(addSeconds_date_format);
      }
    }
  };

  const fullDateScreen = cur_date.toLocaleString().split(" ");
  const timeScreen = fullDateScreen[1];
  const dateScreen = fullDateScreen[0];
  const dayScreen = dayNames[cur_date.getDay()];
  const monthScreen = monthNames[cur_date.getMonth()];
  const dateScreenFormat = dateScreen.replaceAll(".", " ");
  const firstNumber = dateScreenFormat[0];
  const smallDateFormat =
    dayScreen   ","   " "   dateScreenFormat.slice(1, -8)   " "   monthScreen;
  const bigDateFormat =
    dayScreen   ","   " "   dateScreenFormat.slice(0, -8)   " "   monthScreen;

  const changeHandler = (e) => {
    setValue(e.target.value);
  };

  return (
    <div className={styles.content}>
      <div className={styles.inputDublicat}>
        <h1>{timeScreen.slice(0, 5)}</h1>
        <p>{firstNumber == 0 ? smallDateFormat : bigDateFormat}</p>
      </div>
      <div className={styles.bodyFlex}>
        <div className={styles.main}>
          <div>
            <h1 className={styles.title}> Frontend Task</h1>
            <input
              ref={inputEl}
              value={value}
              onChange={changeHandler}
              onKeyDown={keyHandler}
            />

            <div className={styles.textBlock}>
              <div className={styles.instruction}>
                <p>
                  You can change input parts of date
                  (day,month,year,hour,minutes,seconds) by pressing buttons or
                  combination. The cursor must be on the focus in the input
                  field.
                </p>
              </div>
              <div>
                <h3>Buttons </h3>
                <p>&uarr; - unmutable date</p>
                <p>&darr; - unmutable date</p>
              </div>
              <div>
                <h3>Combinations</h3>
                <p>"CTRL"   &uarr; - mutable date</p>
                <p>"CTRL"   &darr; - unmutable date</p>
              </div>
            </div>
          </div>
        </div>
        <div>
          <p className={styles.name}>DAVID ABRAMOV</p>
          <hr width="450%" className={styles.line} />
        </div>
      </div>
    </div>
  );
};

export default DataInput;

uj5u.com熱心網友回復:

我猜你會收到兩個 keyDown 事件,因為“ctrl”和“向上箭頭”鍵都會觸發它們自己單獨的 keyDown 事件。

檢查這一點的最簡單方法是觀察e.key == "arrowUp"并檢查事件的修飾符狀態以查看是否還按下了“Control”。

(您還應該確認該組合鍵沒有被其他功能阻止;在我的筆記本電腦上 ctrl-arrow-up 啟動 OSX 的 Mission Control 應用程式,老實說,我不記得這是默認組合鍵還是我設定的東西忘記了)

(請注意,鍵名不是標準化的,您需要在其他情況下構建以實作跨平臺和跨瀏覽器支持。)

document.getElementById("foo").addEventListener("keydown", e => {
  console.log("Event key: ", e.key)
  console.log("Control modifier:", e.getModifierState("Control"))
  
  if (e.key === "ArrowUp" && e.getModifierState("Control")) {
    console.log("Ctrl-arrow-up pressed");
  }
})
Type in here: <input id="foo">

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/353258.html

標籤:javascript html 反应 按键

上一篇:根據布林值更改表格中的單元格文本-Html

下一篇:在錨點單擊時切換輸入欄位

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more