<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      winform中也可以這樣做數(shù)據(jù)展示?

      1、前言

      在做winform開發(fā)的過程中,經(jīng)常需要做數(shù)據(jù)展示的功能,之前一直使用的是gridcontrol控件,今天想通過一個示例,跟大家介紹一下如何在winform blazor hybrid中使用ant design blazor中的table組件做數(shù)據(jù)展示。

      2、效果

      先來看看實現(xiàn)的效果:

      數(shù)據(jù)展現(xiàn)效果

      image-20231215110015929

      3、具體實現(xiàn)

      怎么在winform blazor hybrid項目中使用Ant Design Blazor可以看我上篇文章。

      引入Ant Design Blazor的Table組件:

       <Table TItem="IData" DataSource="@datas" 
          OnRowClick="OnRowClick" @ref="antTableRef" >
          <PropertyColumn Property="c=>c.StationName">            
          </PropertyColumn>
          <PropertyColumn Property="c=>c.Weather">
          </PropertyColumn>
          <PropertyColumn Property="c=>c.Tem_Low">            
          </PropertyColumn>
          <PropertyColumn Property="c=>c.Tem_High">          
          </PropertyColumn>
          <PropertyColumn Property="c=>c.Wind">
          </PropertyColumn>
          <PropertyColumn Property="c=>c.Visibility_Low">
          </PropertyColumn>
          <PropertyColumn Property="c=>c.Visibility_High">
          </PropertyColumn>
          <PropertyColumn Property="c=>c.Fog">
          </PropertyColumn>
          <PropertyColumn Property="c=>c.Haze">
          </PropertyColumn>
          <PropertyColumn Property="c=>c.Date">
          </PropertyColumn>
      </Table>

      其中:

      TItem表示DataSource中單個項的類型,從 0.16.0 開始,Table 已支持普通類、record、接口和抽象類作為 DataSource 的類型。

      這里我的TItem設(shè)置為一個叫做IData的接口,它的定義如下:

      public interface IData
      {
        [DisplayName("站名")]
         public string? StationName { get; set; }
        [DisplayName("天氣")]
         public string? Weather { get; set; }
        [DisplayName("最低溫度/℃")]
         public string? Tem_Low { get; set; }
        [DisplayName("最高溫度/℃")]
         public string? Tem_High { get; set; }
        [DisplayName("風(fēng)力風(fēng)向")]
         public string? Wind { get; set; }
        [DisplayName("最低可見度/km")]
         public string? Visibility_Low { get; set; }
        [DisplayName("最高可見度/km")]
         public string? Visibility_High { get; set; }
        [DisplayName("霧")]
         public string? Fog { get; set; }
        [DisplayName("霾")]
         public string? Haze { get; set; }
        [DisplayName("日期")]
         public DateTime? Date { get; set; }
      }

      其中的[DisplayName("站名")]是一個屬性或成員的元數(shù)據(jù)注解,用于提供一個更友好的顯示名稱。Ant Design Blazor會自動使用這個來顯示名稱。

      DataSource表示表格的數(shù)據(jù)源,類型為IEnumerable

      image-20231215151309395

       

      這里DataSource="@datas"表示我將一個名為 datas 的數(shù)據(jù)源分配給Table組件的 DataSource 屬性。

      datas的定義如下:

       WeatherData[] datas = Array.Empty<WeatherData>();

      WeatherData是自定義類,實現(xiàn)了IData接口:

          public class WeatherData : IData
        {
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
             public int Id { get; set; }    
             public string? StationName { get; set; }
             public string? Weather { get; set; }
             public string? Tem_Low { get; set; }
             public string? Tem_High { get; set; }
             public string? Wind { get; set; }
             public string? Visibility_Low { get; set; }
             public string? Visibility_High { get; set; }
             public string? Fog { get; set; }
             public string? Haze { get; set; }
             public DateTime? Date { get; set; }
        }
      }

      看到這里大家可能會有個疑問,那就是剛剛的TItem表示DataSource中單個項的類型,但是現(xiàn)在這里DataSourceWeatherData[],那么單個項的類型是WeatherData而不是剛剛設(shè)置的IData,這樣可以嗎?

      通過以下這個簡單的例子,可能你就會解開疑惑:

      public interface IFlyable
      {
         void Fly();
      }
      public class Bird : IFlyable
      {
         public void Fly()
        {
             Console.WriteLine("The bird is flying.");
        }
      ?
      }
      class Program
      {
         // 主方法
         static void Main()
        {
            Bird myBird = new Bird();
            IFlyable flyableObject = myBird; // 類型轉(zhuǎn)換
      ?
             // 調(diào)用接口方法
             flyableObject.Fly();
        }
      }

      定義了一個IFlyable接口、一個Bird類,該類實現(xiàn)了IFlyable接口,在Main函數(shù)中,實例化了一個Bird類,然后該對象隱式轉(zhuǎn)換為接口類型,再通過接口調(diào)用實現(xiàn)類的方法,輸出結(jié)果為:

      The bird is flying.

      這說明C# 中當(dāng)一個類實現(xiàn)了一個接口時,該類的實例可以被隱式轉(zhuǎn)換為該接口類型。這里就是WeatherData會被隱式轉(zhuǎn)化為了IData

      DataSource也是一樣,雖然官方文檔上寫的類型是IEnumerable,但是我們這里確是WeatherData[]這樣也可以,也是因為Array實現(xiàn)了IEnumerable接口,如下所示:

      image-20231215155107743

      OnRowClick表示行點擊事件,類型為EventCallback<RowData>,本例中實際上沒有用到。

      在Blazor中,@ref 是一個用于在Blazor組件中引用HTML元素或組件實例的指令。通過使用 @ref,你可以在Blazor組件中獲取對DOM元素或子組件的引用,然后在代碼中進行操作或訪問其屬性和方法。

      這里我在Table組件上添加了@ref="antTableRef",在代碼區(qū)域添加了:

       Table<IData>? antTableRef;

      就成功引用了Table組件實例。

      <PropertyColumn>表示屬性列,也就是要展示的列。它的Property屬性指定要綁定的屬性,類型為Expression<Func<TItem, TProp>>

      這里大家可能會有疑問,Expression<Func<TItem, TProp>>到底是啥呀?

      Expression<Func<TItem, TProp>> 是C#中的一個表達式樹,用于表示一個參數(shù)為 TItem 類型且返回值為 TProp 類型的lambda表達式。

      拆開來看,Expression<T> 是一個表示lambda表達式的樹狀結(jié)構(gòu)的類,其中 T 是委托類型。詳細學(xué)習(xí),可以查看官方文檔:

      image-20231215160753817

       

      Func<TItem, TProp> 是一個泛型委托類型,表示一個帶有一個輸入?yún)?shù)和一個輸出參數(shù)的方法,詳細學(xué)習(xí),也可以查看官方文檔:

      image-20231215160924173

      這里也通過一個簡單的例子進行說明:

      Expression<Func<Person, string>> getNameExpression = person => person.Name;

      getNameExpression表示一個Lambda表達式,一個什么樣的Lambda表達式呢?一個輸入?yún)?shù)類型為Person對應(yīng)這里的person、輸出類型為string對應(yīng)這里的person.Name的一個Lambda表達式。

      所以代碼:

      <PropertyColumn Property="c=>c.StationName">            
      </PropertyColumn>

      就可以理解了,Property的類型是一個輸入?yún)?shù)類型為TItem這里TItem的類型就是IData、輸出類型為TProp這里TProp類型就是string的一個Lamda表達式c=>c.StationName

      理解了以上之后,我們看看這部分的代碼:

      image-20231215162534740

      代碼如下:

      <GridRow>
           <Space>
                 <SpaceItem>
                     <Text Strong>開始日期:</Text>
                 </SpaceItem>
                 <SpaceItem>
                     <DatePicker TValue="DateTime?" Format="yyyy/MM/dd"
                     Mask="yyyy/dd/MM" Placeholder="@("yyyy/dd/MM")"
                     @bind-Value = "Date1"/>
                 </SpaceItem>
                 <SpaceItem>
                     <Text Strong>結(jié)束日期:</Text>
                 </SpaceItem>
                 <SpaceItem>
                     <DatePicker TValue="DateTime?" Format="yyyy/MM/dd"
                     Mask="yyyy/dd/MM" Placeholder="@("yyyy/dd/MM")"
                     @bind-Value = "Date2"/>
                 </SpaceItem>
             <SpaceItem>
                 <Text Strong>站名:</Text>
             </SpaceItem>
             <SpaceItem>
                 <AutoComplete @bind-Value="@value"
                               Options="@options"
                               OnSelectionChange="OnSelectionChange"
                               OnActiveChange="OnActiveChange"
                               Placeholder="input here"
                               Style="width:150px"/>
             </SpaceItem>
             <SpaceItem>
                 <Button Type="@ButtonType.Primary" OnClick="QueryButton_Clicked">查詢</Button>
             </SpaceItem>
             </Space>
      </GridRow>

      站名自動填充:

        <AutoComplete @bind-Value="@value"
                               Options="@options"
                               OnSelectionChange="OnSelectionChange"
                               OnActiveChange="OnActiveChange"
                               Placeholder="input here"
                               Style="width:150px"/>

      這個的實現(xiàn),在上篇文章中已經(jīng)介紹了,這里就不再重復(fù)講了。

      兩個日期選擇組件都使用了數(shù)據(jù)綁定:

       <SpaceItem>
          <DatePicker TValue="DateTime?" Format="yyyy/MM/dd"
                      Mask="yyyy/dd/MM" Placeholder="@("yyyy/dd/MM")"
                     @bind-Value = "Date1"/>
      </SpaceItem>
         
      <SpaceItem>
           <DatePicker TValue="DateTime?" Format="yyyy/MM/dd"
                     Mask="yyyy/dd/MM" Placeholder="@("yyyy/dd/MM")"
                     @bind-Value = "Date2"/>
      </SpaceItem>

      其中:

      TValue表示值的類型,這里設(shè)置為DateTime?

      @bind-Value進行數(shù)據(jù)綁定,將日期選擇組件的值與Date1和Date2綁定起來:

       DateTime? Date1;
      DateTime? Date2;

      查詢按鈕:

      <Button Type="@ButtonType.Primary" OnClick="QueryButton_Clicked">查詢</Button>

      點擊事件代碼:

      async void QueryButton_Clicked()
      {
         if (Date1 != null && Date2 != null && value != null)
        {
             var cofig = new MessageConfig()
                {
                     Content = "正在更新中...",
                     Duration = 0
                };
             var task = _message.Loading(cofig);
             var condition = new Condition();
             condition.StartDate = (DateTime)Date1;
             condition.EndDate = (DateTime)Date2;
             condition.StationName = value;
             datas = weatherServer.GetDataByCondition(condition).ToArray();
             StateHasChanged();  
             task.Start();
        }
         else
        {
             await _message.Error("請查看開始日期、結(jié)束日期與站名是否都已選擇!!!");
        }
      }

      當(dāng)條件成立時,創(chuàng)建Condition類型,寫入開始日期、結(jié)束日期和站名,Condition類的定義如下:

       public class Condition
      {
          public DateTime StartDate{ get; set; }
          public DateTime EndDate { get; set; }
          public string? StationName { get; set; }    
      }

      然后調(diào)用業(yè)務(wù)邏輯層的weatherServer中的GetDataByCondition方法:

       datas = weatherServer.GetDataByCondition(condition).ToArray();

      weatherServer中的GetDataByCondition方法如下:

       public List<WeatherData> GetDataByCondition(Condition condition)
      {
          return dataService.GetDataByCondition(condition);
      }

      因為涉及到數(shù)據(jù)庫的讀寫,因此調(diào)用了數(shù)據(jù)庫訪問層中的dataService的GetDataByCondition方法。

      數(shù)據(jù)庫訪問層中的dataService的GetDataByCondition方法如下:

        public List<WeatherData> GetDataByCondition(Condition condition)
      {
           return db.Queryable<WeatherData>()
                    .Where(x => x.Date >= condition.StartDate &&
                                x.Date < condition.EndDate.AddDays(1) &&
                                x.StationName == condition.StationName).ToList();
      }

      當(dāng)重新查詢時:

       StateHasChanged();  

      調(diào)用這個方法組件會進行更新。在Blazor中,StateHasChanged 是一個方法,用于通知Blazor框架重新渲染組件及其子組件。Blazor組件的UI渲染是基于組件的狀態(tài)(state)的,當(dāng)組件的狀態(tài)發(fā)生變化時,需要調(diào)用 StateHasChanged 方法來通知框架進行重新渲染。

       var cofig = new MessageConfig()
                {
                     Content = "正在更新中...",
                     Duration = 0
                };
      var task = _message.Loading(cofig);
      task.Start();

      是給用戶信息提示。

      4、總結(jié)

      以上通過一個完整的例子,說明了在winform中除了可以用girdcontrol做數(shù)據(jù)展示外也可以使用Ant Design Blazor中的Table做數(shù)據(jù)展示。

      posted @ 2023-12-15 17:16  mingupupup  閱讀(1908)  評論(6)    收藏  舉報
      主站蜘蛛池模板: 中国女人熟毛茸茸A毛片| 亚洲v欧美v国产v在线观看| 色综合色综合久久综合频道88| 尤物国产精品福利在线网| 国产不卡的一区二区三区| 99精品国产一区二区三区不卡 | 好吊视频专区一区二区三区| 午夜av高清在线观看| 色护士极品影院| 国模雨珍浓密毛大尺度150p| 免费av深夜在线观看| 无码任你躁久久久久久久| 亚洲av无码一区二区三区网站| 国产精品亚洲av三区色| 吃奶还摸下面动态图gif| 亚洲成人四虎在线播放| 人妻夜夜爽天天爽三区麻豆av| 97人人添人人澡人人澡人人澡| 亚洲综合在线日韩av| 亚洲国产精品一二三四五| 亚洲一本二区偷拍精品| 极品少妇被猛得白浆直流草莓视频| 激情综合网一区二区三区| 国产精品中文字幕久久| 成 人色 网 站 欧美大片在线观看| 久青草视频在线免费观看| 国产精品区一区第一页| 大陆熟妇丰满多毛xxxⅹ| 国产亚洲一区二区三区成人| 久久久久久综合网天天| 伊人精品成人久久综合| 久久精品高清一区二区三区| 麻豆精品一区二区综合av| 性欧美丰满熟妇xxxx性| 人人爽人人澡人人人妻| 精品国产美女福到在线不卡| 阿尔山市| 国产成人午夜在线视频极速观看| 国产成人AV在线免播放观看新 | 亚洲国产片一区二区三区| 国产超高清麻豆精品传媒麻豆精品 |