csharp Remove Empty rows in datatable

 1 //20120803 Geovin Du
 2                 //塗聚文 締友計算機信息技術有限公司
 3                 DataTable dt = new DataTable();
 4                 dt=agreementMonthlySalaryListBLL.SelectImportExceltoDataGridView(fileUrl, sheet).Copy();
 5 
 6                 if ((dt != null) && (dt.Rows != null) && (dt.Rows.Count > 0))
 7                 {
 8                     List<System.Data.DataRow> removeRowIndex = new List<System.Data.DataRow>();
 9                     int RowCounter = 0;
10                     foreach (System.Data.DataRow dRow in dt.Rows)
11                     {
12                         for (int index = 0; index < dt.Columns.Count; index++)
13                         {
14                             if (dRow[index] == DBNull.Value)
15                             {
16                                 removeRowIndex.Add(dRow);
17                                 break;
18                             }
19                             else if (string.IsNullOrEmpty(dRow[index].ToString().Trim()))
20                             {
21                                 removeRowIndex.Add(dRow);
22                                 break;
23                             }
24                         }
25                         RowCounter++;
26                     }
27                     // Remove all blank of in-valid rows
28                     foreach (System.Data.DataRow rowIndex in removeRowIndex)
29                     {
30                         dt.Rows.Remove(rowIndex);
31                     }
32                 }
33                 dataGridView1.DataSource = null;
34                 set.SetDataGridViewBindingSourceNavigatorBinds(dataGridView1,dt , bindingSource1, bindingNavigator1);

 

转载于:https://www.cnblogs.com/geovindu/archive/2012/08/02/2620522.html

<!--由代码生成工具生成--> <UserControl x:Class="MES.Client.Tooling.UserControls.ModifyMeasuringFaliureTracing" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:local="clr-namespace:MES.Client.Tooling.UserControls" xmlns:hc1="clr-namespace:Minio.DataModel;assembly=Minio" d:DataContext="{d:DesignInstance Type=local:ModifyMeasuringFaliureTracingViewModel}" mc:Ignorable="d" d:DesignHeight="350" d:DesignWidth="600"> <UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/MES.Client.UICommon;component/Styles/CommStyle.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </UserControl.Resources> <hc:DialogContainer> <Border CornerRadius="3" Background="{DynamicResource DialogPrimaryBrush}"> <Grid TextBlock.Foreground="{DynamicResource DefaultFontColorBrush}"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <!--标题--> <Border CornerRadius="4 4 0 0" Background="{DynamicResource DialogTitleBrush}" BorderThickness="0" TextBlock.Foreground="{DynamicResource DefaultFontColorBrush}"> <Grid Margin="0 10"> <TextBlock Text="{Binding Title,FallbackValue=量具失效追溯管理}" FontWeight="SemiBold" FontSize="14" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20 0 0 0"/> <Button Style="{StaticResource CloseButtonStyle}"/> </Grid> </Border> <!--表单--> <Grid Grid.Row="1" Margin="0 10"> <ScrollViewer VerticalScrollBarVisibility="Auto"> <!-- 允许垂直滚动 --> <UniformGrid Columns="1"> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[ToolCode],FallbackValue=ToolCode}" VerticalAlignment="Center" Text="{Binding SelectData.ToolCode}" hc:InfoElement.Necessary="True"/> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[DeviceName],FallbackValue=DeviceName}" VerticalAlignment="Center" Text="{Binding SelectData.DeviceName}" hc:InfoElement.Necessary="True"/> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[Manufacturer],FallbackValue=Manufacturer}" VerticalAlignment="Center" Text="{Binding SelectData.Manufacturer}"/> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[ModelSpec],FallbackValue=ModelSpec}" VerticalAlignment="Center" Text="{Binding SelectData.ModelSpec}"/> <hc:DateTimePicker hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[FailureDate],FallbackValue=FailureDate}" VerticalAlignment="Center" SelectedDateTime="{Binding SelectData.FailureDate}" hc:InfoElement.Necessary="True"/> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[FailurePhenomenon],FallbackValue=FailurePhenomenon}" VerticalAlignment="Center" Text="{Binding SelectData.FailurePhenomenon}" /> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[IsInvolveProduct],FallbackValue=IsInvolveProduct}" VerticalAlignment="Center" Text="{Binding SelectData.IsInvolveProduct}" /> <hc:TextBox hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" Margin="10 0 10 10" hc:InfoElement.Title="{Binding Langs[Remark],FallbackValue=Remark}" VerticalAlignment="Center" Text="{Binding SelectData.Remark}"/> <hc:Upload hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Title="{Binding Langs[ProcessingRecords],FallbackValue=失效产品处理记录}" FileType="*" MaxCount="5" UploadUrl="{Binding UploadUrl}" Files="{Binding SelectData.ProcessingRecords, Mode=TwoWay}" hc:InfoElement.Placeholder="{Binding Langs[UploadTip],FallbackValue=处理记录请自行上传}"/> </UniformGrid> </ScrollViewer> </Grid> <DockPanel Grid.Row="2" Margin="13 0"> <Button Margin="10" Width="130" Background="{DynamicResource AddBtnBrush}" Foreground="White" BorderBrush="{DynamicResource AddBtnBrush}" Content="{Binding Langs[Confirm]}" DockPanel.Dock="Right" HorizontalAlignment="Right" Command="{Binding SaveCommand}"/> <Button Margin="10" Width="130" Content="{Binding Langs[Cancel]}" DockPanel.Dock="Right" HorizontalAlignment="Right" Command="hc:ControlCommands.Close"/> </DockPanel> </Grid> </Border> </hc:DialogContainer> </UserControl> <UserControl x:Class="MES.Client.Tooling.UserControls.MeasuringFaliureTracing" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:hc="https://handyorg.github.io/handycontrol" xmlns:control="clr-namespace:MES.Client.UICommon.Controls;assembly=MES.Client.UICommon" hc:Dialog.Token="{Binding DialogToken}" d:DataContext="{d:DesignInstance Type=usercontrols:MeasuringFaliureTracingViewModel,IsDesignTimeCreatable=True}" xmlns:enum="clr-namespace:MES.Client.Toolkit.Enums;assembly=MES.Client.Toolkit" xmlns:usercontrols="clr-namespace:MES.Client.Tooling.UserControls" xmlns:sync="http://schemas.syncfusion.com/wpf" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <UserControl.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/MES.Client.UICommon;component/Styles/CommStyle.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </UserControl.Resources> <hc:DialogContainer> <Grid Background="{DynamicResource MESPrimaryBrush}"> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition/> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal" Margin="10"> <TextBlock Text="量具失效追溯管理" FontWeight="DemiBold" VerticalAlignment="Center" FontSize="16" Margin="21 0 0 0"/> <Border BorderThickness="1 0 0 0" BorderBrush="{DynamicResource MESBorderBrush}" Margin="20 0" Height="24"/> <control:IconButton Visibility="{Binding MenuID,Converter={StaticResource getPermissonToVisibilityConverter},ConverterParameter={x:Static enum:PermissonEnum.Add }}" IBForeground="{DynamicResource PaginationSelectedBrush}" Background="{DynamicResource AddBtnBrush}" StrText="{Binding Langs[Add]}" Icon="" BorderThickness="0" FontSize="14" Margin="0 0 10 0" Command="{Binding ModifyCommand}"/> </StackPanel> <hc:Card Grid.Row="1" Margin="10 0 10 10" BorderThickness="1"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition/> <RowDefinition Height="auto"/> </Grid.RowDefinitions> <DockPanel TextBlock.FontSize="14"> <hc:TextBox Margin="13" hc:InfoElement.Title="{Binding Langs[ToolCode],FallbackValue=ToolCode}" Text="{Binding SearchData.ToolCode}" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" hc:InfoElement.TitlePlacement="Left" HorizontalAlignment="Left" Width="150"/> <hc:TextBox Margin="13" hc:InfoElement.Title="{Binding Langs[DeviceName],FallbackValue=DeviceName}" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}" hc:InfoElement.TitlePlacement="Left" Width="150" Text="{Binding SearchData.DeviceName}"/> <hc:DateTimePicker Margin="13" SelectedDateTime ="{Binding SearchData.StartFailureDate}" Style="{StaticResource DateTimePickerPlus}" hc:InfoElement.Title="{Binding Langs[StartFailureDate],FallbackValue=StartFailureDate}" hc:InfoElement.TitlePlacement="Left" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}"/> <hc:DateTimePicker Margin="13" SelectedDateTime="{Binding SearchData.EndFailureDate}" Style="{StaticResource DateTimePickerPlus}" hc:InfoElement.Title="{Binding Langs[EndFailureDate],FallbackValue=EndFailureDate}" hc:InfoElement.TitlePlacement="Left" hc:InfoElement.Placeholder="{Binding Langs[PleaseEnter]}"/> <control:IconButton Visibility="{Binding MenuID,Converter={StaticResource getPermissonToVisibilityConverter},ConverterParameter={x:Static enum:PermissonEnum.Query }}" StrText="{Binding Langs[Search]}" Icon="" FontSize="14" HorizontalAlignment="Left" Margin="32 0 0 0" Command="{Binding SearchCommand}"/> </DockPanel> <control:MESSfDataGrid SelectedItems="{Binding SelectedItems,Mode=TwoWay}" SelectionMode="Extended" IsShowChooseBtn="True" MenuID="{Binding MenuID}" Token="{Binding DialogToken}" Margin="10 0 10 5" ItemsSource="{Binding DataList}" Grid.Row="1" Langs="{Binding Langs}" EditCommand="{Binding ModifyCommand}" DeleteCommand="{Binding DeleteCommand}" ImportCommand="{Binding SearchCommand}" SolTypeName="VENDOR" IsImport="{Binding MenuID,Converter={StaticResource getPermissonToBoolConverter},ConverterParameter={x:Static enum:PermissonEnum.Import }}" IsDel="{Binding MenuID,Converter={StaticResource getPermissonToBoolConverter},ConverterParameter={x:Static enum:PermissonEnum.Delete }}" IsEdit="{Binding MenuID,Converter={StaticResource getPermissonToBoolConverter},ConverterParameter={x:Static enum:PermissonEnum.Modify }}" IsDetail="False"> <control:MESSfDataGrid.Columns> <sync:GridTextColumn MappingName="Id" HeaderText="{Binding Langs[Id],FallbackValue=Id}" IsHidden="True"/> <sync:GridTextColumn MappingName="ItemNo" HeaderText="{Binding Langs[ItemNo],FallbackValue=ItemNo}" IsHidden="True"/> <sync:GridTextColumn MappingName="ToolCode" HeaderText="{Binding Langs[ToolCode],FallbackValue=ToolCode}" IsHidden="False"/> <sync:GridTextColumn MappingName="DeviceName" HeaderText="{Binding Langs[DeviceName],FallbackValue=DeviceName}" IsHidden="False"/> <sync:GridTextColumn MappingName="Manufacturer" HeaderText="{Binding Langs[Manufacturer],FallbackValue=Manufacturer}" IsHidden="False"/> <sync:GridTextColumn MappingName="ModelSpec" HeaderText="{Binding Langs[ModelSpec],FallbackValue=ModelSpec}" IsHidden="False"/> <sync:GridDateTimeColumn CustomPattern="yyyy-MM-dd HH:mm:ss" Pattern="CustomPattern" MappingName="FailureDate" HeaderText="{Binding Langs[FailureDate],FallbackValue=FailureDate}" IsHidden="False"/> <sync:GridTextColumn MappingName="FailurePhenomenon" HeaderText="{Binding Langs[FailurePhenomenon],FallbackValue=FailurePhenomenon}" IsHidden="False"/> <sync:GridTextColumn MappingName="IsInvolveProduct" HeaderText="{Binding Langs[IsInvolveProduct],FallbackValue=IsInvolveProduct}" IsHidden="False"/> <!--失效产品处理记录--> <!-- 在现有列后追加 --> <sync:GridTextColumn MappingName="ProcessingRecords" HeaderText="{Binding Langs[ProcessingRecords],FallbackValue=失效产品处理记录}" IsHidden="False"/> <sync:GridTextColumn MappingName="Remark" HeaderText="{Binding Langs[Remark],FallbackValue=Remark}" IsHidden="False"/> <!-- <sync:GridDateTimeColumn CustomPattern="yyyy-MM-dd HH:mm:ss" Pattern="CustomPattern" MappingName="CreateTime" HeaderText="{Binding Langs[CreateTime],FallbackValue=CreateTime}" IsHidden="True"/> <sync:GridTextColumn MappingName="CreateUser" HeaderText="{Binding Langs[CreateUser],FallbackValue=CreateUser}" IsHidden="False"/> <sync:GridDateTimeColumn CustomPattern="yyyy-MM-dd HH:mm:ss" Pattern="CustomPattern" MappingName="UpdateTime" HeaderText="{Binding Langs[UpdateTime],FallbackValue=UpdateTime}" IsHidden="True"/> <sync:GridTextColumn MappingName="UpdateUser" HeaderText="{Binding Langs[UpdateUser],FallbackValue=UpdateUser}" IsHidden="True"/>--> </control:MESSfDataGrid.Columns> </control:MESSfDataGrid> <control:YLHPagination Margin="10 5" Grid.Row="2" PageIndex="{Binding PageIndex,Mode=TwoWay}" TotalCount="{Binding TotalCount}" PageSize="{Binding PageSize,Mode=TwoWay}" TotalPages="{Binding TotalPages,Mode=TwoWay}"/> </Grid> </hc:Card> </Grid> </hc:DialogContainer> </UserControl>修改里面的上传文件那块代码 <hc:Upload hc:InfoElement.TitlePlacement="Left" hc:InfoElement.TitleWidth="100" hc:InfoElement.Title="{Binding Langs[ProcessingRecords],FallbackValue=失效产品处理记录}" FileType="*" MaxCount="5" UploadUrl="{Binding UploadUrl}" Files="{Binding SelectData.ProcessingRecords, Mode=TwoWay}" hc:InfoElement.Placeholder="{Binding Langs[UploadTip],FallbackValue=处理记录请自行上传}"/>using HandyControl.Tools.Extension; using MES.Client.Tooling.Models.MeasuringFaliureTracing; using MES.Client.Toolkit.Comm; using MES.Client.Toolkit.Enums; using MES.Client.Toolkit.HTTP; using MES.Client.UICommon.Controls; using MES.Common.Toolkit.Helper; using System; using System.Collections.Generic; using System.Text; using System.Windows.Controls; using System.Windows.Input; namespace MES.Client.Tooling.UserControls { /// <summary> /// ModifyMeasuringFaliureTracing.xaml 的交互逻辑 /// </summary> public partial class ModifyMeasuringFaliureTracing : UserControl { public ModifyMeasuringFaliureTracing(MeasuringFailureTracingModel masModel, Dictionary<string, string> langs, OperateStateEmun stateEmun) { InitializeComponent(); DataContext = new ModifyMeasuringFaliureTracingViewModel(masModel, langs, stateEmun); } } public class ModifyMeasuringFaliureTracingViewModel : ViewModelBase, IDialogResultable<bool> { private MeasuringFailureTracingModel selectData = new(); private Dictionary<string, string> langs = new(); private string title = string.Empty; public string UploadUrl { get; set; } = "api/Tooling/MeasuringFaliureTracing/UnLoad"; public string ProcessingRecords { get; set; } = string.Empty; public MeasuringFailureTracingModel SelectData { get => selectData; set { selectData = value; PCEH(); } } public Dictionary<string, string> Langs { get => langs; set { langs = value; PCEH(); } } public bool Result { get; set; } = false; public Action? CloseAction { get; set; } /// <summary> /// 保存 /// </summary> public ICommand SaveCommand { get; set; } public string Title { get => title; set { title = value; PCEH(); } } /// <summary> /// 操作类型 /// </summary> public OperateStateEmun StateEmun { get; set; } public ModifyMeasuringFaliureTracingViewModel(MeasuringFailureTracingModel itemtModel, Dictionary<string, string> langs, OperateStateEmun stateEmun) { StateEmun = stateEmun; SelectData = itemtModel.Clone(); //if (stateEmun == OperateStateEmun.Add) //{ // SelectData.LastAnalysisDate ??= DateTime.Today.AddDays(-30); // SelectData.NextRemindDate ??= DateTime.Today.AddDays(30); //} Langs = langs; Initialize(); SaveCommand = new CommandBase(async l => { if (!Check()) return; string ret = string.Empty; int toolCodeLength = getStringLength(SelectData.ToolCode); if (toolCodeLength > 40) { Message.Warnning(Langs.LangGetValue("ToolCode") + Langs.LangGetValue("CharacterLengthIsLong")); return; } int deviceNameLength = getStringLength(SelectData.DeviceName); if (deviceNameLength > 40) { Message.Warnning(Langs.LangGetValue("DeviceName") + Langs.LangGetValue("CharacterLengthIsLong")); return; } if (!string.IsNullOrEmpty(SelectData.Manufacturer)) { int manufacturerLength = getStringLength(SelectData.Manufacturer); if (manufacturerLength > 40) { Message.Warnning(Langs.LangGetValue("Manufacturer") + Langs.LangGetValue("CharacterLengthIsLong")); return; } } if (!string.IsNullOrEmpty(SelectData.ModelSpec)) { int modelSpecLength = getStringLength(SelectData.ModelSpec); if (modelSpecLength > 100) { Message.Warnning(Langs.LangGetValue("ModelSpec") + Langs.LangGetValue("CharacterLengthIsLong")); return; } } if (!string.IsNullOrEmpty(SelectData.FailurePhenomenon)) { int failurePhenomenonLength = getStringLength(SelectData.FailurePhenomenon); if (failurePhenomenonLength > 200) { Message.Warnning(Langs.LangGetValue("FailurePhenomenon") + Langs.LangGetValue("CharacterLengthIsLong")); return; } } if (!string.IsNullOrEmpty(SelectData.IsInvolveProduct)) { int isInvolveProductLength = getStringLength(SelectData.IsInvolveProduct); if (isInvolveProductLength > 1) { Message.Warnning(Langs.LangGetValue("IsInvolveProduct") + Langs.LangGetValue("CharacterLengthIsLong")); return; } } if (!string.IsNullOrEmpty(SelectData.Remark)) { int remarkLength = getStringLength(SelectData.Remark); if (remarkLength > 300) { Message.Warnning(Langs.LangGetValue("Remark") + Langs.LangGetValue("CharacterLengthIsLong")); return; } } ret = await APIHelper.PostSendAsync(ApiRoutes.SaveMeasuringFaliureTracing, SelectData); if (ret is not null) { string successMsg = StateEmun == OperateStateEmun.Add ? Langs.LangGetValue("添加成功") : Langs.LangGetValue("修改成功"); MESGrowl.MESSuccess(successMsg); Result = true; CloseAction?.Invoke(); } }); } public int getStringLength(string str) { if (str.Equals(string.Empty)) return 0; int strlen = 0; ASCIIEncoding strData = new ASCIIEncoding(); // 将字符串转换为ASCII编码的字节数字 byte[] strBytes = strData.GetBytes(str); for (int i = 0; i <= strBytes.Length - 1; i++) { if (strBytes[i] == 63) // 中文都将编码为ASCII编码63,即"?"号 strlen += 2; strlen++; } return strlen; } private bool Check() { if (string.IsNullOrEmpty(SelectData.ToolCode)) { Message.Warnning(Langs.LangGetValue("ToolCode") + Langs.LangGetValue("IsInvalid")); return false; } // 检查DeviceName(设备名称)是否为空 if (string.IsNullOrEmpty(SelectData.DeviceName)) { Message.Warnning(Langs.LangGetValue("DeviceName") + Langs.LangGetValue("IsNull")); return false; } //// 检查LastAnalysisDate(上次分析日期)是否有值 //if (!SelectData.LastAnalysisDate.HasValue) //{ // Message.Warnning(Langs.LangGetValue("LastAnalysisDate") + Langs.LangGetValue("IsNull")); // return false; //} // 检查TestItem(测试项目)是否为空 if (!SelectData.FailureDate.HasValue) { Message.Warnning(Langs.LangGetValue("FailureDate") + Langs.LangGetValue("IsNull")); return false; } return true; } private void Initialize() { switch (StateEmun) { case OperateStateEmun.Add: Title = Langs.LangGetValue("新增"); break; case OperateStateEmun.Edit: Title = Langs.LangGetValue("修改"); break; case OperateStateEmun.Detail: break; default: break; } } } }using HandyControl.Controls; using HandyControl.Tools.Extension; using MES.Client.Models.Dtos; using MES.Client.Models.Models; using MES.Client.Tooling.Dto.MeasuringFaliureTracing; using MES.Client.Tooling.Models.MeasuringFaliureTracing; using MES.Client.Toolkit.Comm; using MES.Client.Toolkit.Enums; using MES.Client.Toolkit.HTTP; using MES.Client.UICommon.Comm; using MES.Client.UICommon.Controls; using MES.Client.UICommon.Helper; using MES.Common.Toolkit.Helper; using Microsoft.Win32; using Newtonsoft.Json; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.IO; using System.Linq; using System.Reflection; using System.Windows; using System.Windows.Controls; namespace MES.Client.Tooling.UserControls { /// <summary> /// MeasuringFaliureTracing.xaml 的交互逻辑 /// </summary> public partial class MeasuringFaliureTracing : UserControl { private MeasuringFaliureTracingViewModel model; public MeasuringFaliureTracing() { InitializeComponent(); DataContext = model = new MeasuringFaliureTracingViewModel(); Loaded += MeasuringFaliureTracing_Loaded; } //} private void MeasuringFaliureTracing_Loaded(object sender, RoutedEventArgs e) { if (!string.IsNullOrEmpty(model.MenuID)) return; model.MenuID = string.IsNullOrEmpty(Uid) ? "" : Uid; } } public class MeasuringFaliureTracingViewModel : CommonListViewModel<MeasuringFaliureTracingInDto, MeasuringFailureTracingModel> { private MeasuringFailureTracingModel selectedModel = new(); /// <summary> /// 选中的MSA测量记录 /// </summary> public MeasuringFailureTracingModel SelectedModel { get => selectedModel; set { selectedModel = value; PCEH(); } } //private ObservableCollection<MeasuringFailureTracingModel> selectedItems = new(); //public ObservableCollection<MeasuringFailureTracingModel> SelectedItems //{ // get => selectedItems; // set // { // SetProperty(ref selectedItems, value); // SelectedIds = value.Select(item => item.Id).ToList(); // } //} //// 2. 选中的 ID 列表(传给后端) //private List<string> selectedIds = new(); //public List<string> SelectedIds //{ // get => selectedIds; // set => SetProperty(ref selectedIds, value); //} /// <summary> /// 查询条件 /// </summary> private MeasuringFaliureTracingInDto searchData = new(); public MeasuringFaliureTracingInDto SearchData { get => searchData; set { searchData = value; PCEH(); } } public MeasuringFaliureTracingViewModel() { PageIndex = 1; PageSize = 20; /// <summary> /// 查询 /// </summary> SearchCommand = new CommandBase(async l => { var loading = Dialog.Show(new UICommon.Controls.LoadingCircle(), DialogToken); try { SearchParameter = new MeasuringFaliureTracingInDto { Id = SearchData.Id, ToolCode = SearchData.ToolCode, FailureDate = SearchData.FailureDate, DeviceName = SearchData.DeviceName }; SearchParameter.PageIndex = PageIndex; SearchParameter.PageSize = PageSize; SearchParameter.StartFailureDate = SearchData.StartFailureDate; SearchParameter.EndFailureDate = SearchData.EndFailureDate; var ret = await APIHelper.PostSendDtoAsync<PaginationData>( ApiRoutes.GetMeasuringFaliureTracingList, SearchParameter ); if (ret != null) { TotalCount = ret.TotalCount; TotalPages = ret.TotalPages; var dataListJson = ret?.DataList?.ToJson() ?? "[]"; DataList = JsonConvert.DeserializeObject<ObservableCollection<MeasuringFailureTracingModel>>(dataListJson) ?? new(); if (l != null && !string.IsNullOrEmpty(l.ToString())) SelectedItem = DataList.FirstOrDefault(f => f.ToolCode == l.ToString()); } } catch (Exception ex) { Message.Error($"查询失败:{ex.Message}"); } finally { loading.Close(); } }); ModifyCommand = new CommandBase(async l => { bool flag = false; if (l != null) { flag = await Dialog.Show(new ModifyMeasuringFaliureTracing((MeasuringFailureTracingModel)l, Langs, OperateStateEmun.Edit), DialogToken).GetResultAsync<bool>(); } else { flag = await Dialog.Show(new ModifyMeasuringFaliureTracing(new MeasuringFailureTracingModel(), Langs, OperateStateEmun.Add), DialogToken).GetResultAsync<bool>(); } if (flag) { SearchCommand?.Execute(null); } }); DeleteCommand = new CommandBase(async l => { if (l is MeasuringFailureTracingModel deleteItem) { if (Message.Ask(Langs.LangGetValue("DeleteConfirm"))) { List<IdInDto> inDto = new(); inDto.Add(new IdInDto { Id = deleteItem.Id }); var ret = await APIHelper.PostSendAsync(ApiRoutes.DeleteMeasuringFaliureTracing, inDto); if (ret != null) { DataList.Remove(deleteItem); TotalCount -= 1; } } } }); ExportCommand = new CommandBase(async l => { try { var exportParam = new MeasuringFaliureTracingInDto { ToolCode = SearchData.ToolCode, DeviceName = SearchData.DeviceName, StartFailureDate = SearchData.StartFailureDate, EndFailureDate = SearchData.EndFailureDate, IsExport = true }; var exportData = await APIHelper.PostSendDtoAsync<List<MeasuringFailureTracingModel>>( ApiRoutes.ExportMeasuringFaliureTracingPageData, exportParam ); if (exportData == null || !exportData.Any()) { Message.Warnning(Langs.LangGetValue("NoDataToExport")); return; } DataTable ConvertToDataTable<T>(IEnumerable<T> dataList) { var dt = new DataTable(); if (dataList == null || !dataList.Any()) return dt; var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in props) { dt.Columns.Add(prop.Name, typeof(string)); } foreach (var item in dataList) { var row = dt.NewRow(); foreach (var prop in props) { object value = prop.GetValue(item); if (value == null) { value = string.Empty; } else if (value is DateTime date) { value = date.ToString("yyyy-MM-dd HH:mm:ss"); } else if (value is IEnumerable<string> stringList) { value = string.Join(", ", stringList); } else { value = value.ToString(); } row[prop.Name] = value; } dt.Rows.Add(row); } return dt; } var dataTable = ConvertToDataTable(exportData); bool DataTableToExcel(DataTable dt, string filePath) { try { IWorkbook workbook = filePath.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase) ? (IWorkbook)new XSSFWorkbook() : new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet("ExportData"); int rowIndex = 0; var headerRow = sheet.CreateRow(rowIndex++); for (int i = 0; i < dt.Columns.Count; i++) { headerRow.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName); } foreach (DataRow dataRow in dt.Rows) { var row = sheet.CreateRow(rowIndex++); for (int i = 0; i < dt.Columns.Count; i++) { object cellValue = dataRow[i] is DBNull ? string.Empty : dataRow[i]; if (cellValue is DateTime date) { row.CreateCell(i).SetCellValue(date.ToString("yyyy-MM-dd HH:mm:ss")); } else { row.CreateCell(i).SetCellValue(cellValue?.ToString()); } } } for (int i = 0; i < dt.Columns.Count; i++) { sheet.AutoSizeColumn(i); } using (var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { workbook.Write(fs,false); } return true; } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"Excel导出失败: {ex.Message}"); return false; } } var saveDialog = new SaveFileDialog { Title = Langs.LangGetValue("SelectExportPath"), Filter = "Excel文件|*.xls;*.xlsx", FileName = $"{DateTime.Now:yyyyMMdd}_MeasuringFailureExport.xlsx", RestoreDirectory = true, DefaultExt = "xlsx", OverwritePrompt = true }; if (saveDialog.ShowDialog() == true) { bool exportSuccess = DataTableToExcel(dataTable, saveDialog.FileName); if (exportSuccess) { Message.Info(Langs.LangGetValue("ExportSuccess")); } else { Message.Error(Langs.LangGetValue("ExportFailed_FileWrite")); } } } catch (Exception ex) { Message.Error($"{Langs.LangGetValue("ExportFailed")}: {ex.Message}"); } }); } public override void CommViewModelLoad() { SearchCommand?.Execute(null); } } }
08-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值