public void RefreshData() { var tag = Tag as string; var wrap = MainWindow.instance.books[tag]; var wb = wrap.book; var sheet = wb.GetSheetAt(wrap.sheet); var issrc = isSrc; ExcelGrid.Columns.Clear(); //var datas = new ObservableCollection<ExcelData>(); var datas = new List <ExcelData>(); var data_maps = new Dictionary <int, ExcelData>(); MainWindow.instance.excelGridData[tag] = data_maps; if (MainWindow.instance.diffSheetName != null) { var columns = ExcelGrid.Columns; // 不把diff结果转换为原来的顺序。因为隐藏相同行后,转换没有意义 var sheetname = wrap.sheetname; if (!MainWindow.instance.sheetsDiff.ContainsKey(sheetname)) { ExcelGrid.DataContext = datas; return; } var status = MainWindow.instance.sheetsDiff[sheetname]; // 没有比较数据的sheet if (status == null) { return; } // header不会空 var columnCount = wrap.SheetValideColumn[sheet.SheetName]; var headerStr = new string[columnCount]; var needChangeHead = MainWindow.instance.ProcessHeader.IsChecked == true; if (needChangeHead) { var headershow = sheet.GetRow(MainWindow.instance.config.ShowLineID - 1); var headerkey = sheet.GetRow(MainWindow.instance.config.KeyLineID - 1); if (headershow == null || headerkey == null) { return; } int linecount = 0; for (int i = 0; i < columnCount; ++i) { var cellshow = headershow.GetCell(i); var cellkey = headerkey.GetCell(i); var strshow = Util.GetCellValue(cellshow); var strkey = Util.GetCellValue(cellkey); if (string.IsNullOrWhiteSpace(strshow)) { strshow = strkey; } if (string.IsNullOrWhiteSpace(strkey)) { columnCount = i; break; } // 第二行+第三行,合起来作为key var encodestr = System.Uri.EscapeDataString(strkey) + "_" + i;// + System.Uri.EscapeDataString(str); linecount = Math.Max(linecount, strshow.Count((c) => { return(c == '\n'); }) + 1); var tc = new DataGridTemplateColumn(); tc.Header = strshow; tc.CellTemplateSelector = new CellTemplateSelector(encodestr, i, false, tag); tc.CellEditingTemplateSelector = new CellTemplateSelector(encodestr, i, true, tag); columns.Add(tc); headerStr[i] = encodestr; } ExcelGrid.ColumnHeaderHeight = linecount * 25; } else { //AddPrefixRowID(); for (int i = 0; i < columnCount; ++i) { var str = (i + 1).ToString(); var tc = new DataGridTemplateColumn(); tc.Header = str; tc.CellTemplateSelector = new CellTemplateSelector(str, i, false, tag); tc.CellEditingTemplateSelector = new CellTemplateSelector(str, i, true, tag); columns.Add(tc); headerStr[i] = str; } ExcelGrid.ColumnHeaderHeight = 25; } if (needChangeHead) { // 头 for (int j = 0; j < MainWindow.instance.DiffStartIdx(); j++) { var row = sheet.GetRow(j); if (row == null || !Util.CheckValideRow(row)) { break; } var data = new ExcelData(); data.rowId = row.RowNum; data.tag = Tag as string; data.diffIdx = j; data.column2diff = issrc ? status.column2diff1[0] : status.column2diff2[0]; data.diffstatus = status.diffHead; for (int i = 0; i < columnCount; ++i) { var cell = row.GetCell(i); var value = Util.GetCellValue(cell); data.data[headerStr[i]] = new CellData() { value = value, cell = cell }; } if (!status.DiffMaxLineCount.TryGetValue(j, out data.maxLineCount)) { data.maxLineCount = 1; } datas.Add(data); data_maps[data.rowId] = data; } } Dictionary <int, Dictionary <int, CellEditMode> > edited = issrc ? status.RowEdited1 : status.RowEdited2; for (int j = 0; j < status.diffSheet.Count; j++) { int rowid = issrc ? status.Diff2RowID1[j] : status.Diff2RowID2[j]; // 修改过,或者是 if (edited[rowid].Count > 0 || status.diffSheet[j].changed) { var row = sheet.GetRow(rowid); var data = new ExcelData(); data.rowId = rowid; data.tag = Tag as string; data.diffstatus = status.diffSheet[j]; data.diffIdx = j; data.CellEdited = edited[rowid]; data.column2diff = issrc ? status.column2diff1[rowid] : status.column2diff2[rowid]; data.data["rowid"] = new CellData() { value = (rowid + 1).ToString() }; for (int i = 0; i < columnCount; ++i) { var cell = row != null?row.GetCell(i) : null; var value = Util.GetCellValue(cell); data.data[headerStr[i]] = new CellData() { value = value, cell = cell }; } if (!status.DiffMaxLineCount.TryGetValue(j, out data.maxLineCount)) { data.maxLineCount = 1; } datas.Add(data); data_maps[data.rowId] = data; } } } ExcelGrid.ItemsSource = datas; CtxMenu.Items.Clear(); var item = new MenuItem(); item.Header = "行复制到" + (issrc ? "右侧" : "左侧"); item.Click += Menu_CopyToSide; CtxMenu.Items.Add(item); }
public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) { ExcelData rowdata = item as ExcelData; if (rowdata != null) { var rowid = rowdata.rowId; Brush bg = Brushes.White; if (!isEditing) { var rowdiff = rowdata.diffstatus; if (rowdiff != null && rowdiff.diffcells.Count > ColumnID && ColumnID >= 0) { var diffid = rowdata.column2diff[ColumnID]; var diffresult = rowdiff.diffcells[diffid]; DiffStatus status = rowdiff.diffcells[diffid].Status; //var src_rowdata = MainWindow.instance.excelGridData["src"]; //if (rowdata.tag == "dst" && status == DiffStatus.Equal && src_rowdata != null && src_rowdata.ContainsKey(rowid)) { // var cur_value = rowdata.data[Binder].value; // // var src_value = src_rowdata[rowid].data[Binder].value; // if (cur_value != src_value) { // status = DiffStatus.Modified; // } //} var diff_detail = rowdiff.diffcell_details != null ? rowdiff.diffcell_details[diffid]:null; switch (status) { case DiffStatus.Modified: bg = Brushes.Yellow; break; case DiffStatus.Deleted: // 列增删的时候不好处理,不显示影响的格子 if (rowdata.tag == "src") { bg = Brushes.Gray; } break; case DiffStatus.Inserted: // 列增删的时候不好处理,不显示影响的格子 if (rowdata.tag == "dst") { bg = Brushes.LightGreen; } break; default: if (rowdata.CellEdited != null && rowdata.CellEdited.ContainsKey(diffid) && rowdata.CellEdited[diffid] == CellEditMode.Self) { // 单元格修改 bg = new SolidColorBrush(Color.FromRgb(160, 238, 225)); } break; } if (diff_detail != null && diff_detail.Count > 1) { FrameworkElementFactory stackPanel = new FrameworkElementFactory(typeof(StackPanel)); stackPanel.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal); stackPanel.SetValue(StackPanel.BackgroundProperty, bg); for (int i = 0; i < diff_detail.Count; ++i) { if (diff_detail[i] != null) { var diff_cell = diff_detail[i]; if (diff_cell.Status == DiffStatus.Deleted && tag == "dst") { continue; } if (diff_cell.Status == DiffStatus.Inserted && tag == "src") { continue; } FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock)); var text = tag == "dst" ? diff_cell.Obj2.ToString() : diff_cell.Obj1.ToString(); textBlock.SetValue(TextBlock.TextProperty, text); stackPanel.AppendChild(textBlock); if (diff_cell.Status == DiffStatus.Deleted) { textBlock.SetValue(TextBlock.TextDecorationsProperty, TextDecorations.Strikethrough); } else if (diff_cell.Status == DiffStatus.Inserted) { textBlock.SetValue(TextBlock.TextDecorationsProperty, TextDecorations.Underline); } if (diff_cell.Status != DiffStatus.Equal) { textBlock.SetValue(TextBlock.ForegroundProperty, System.Windows.Media.Brushes.Red); } } } return(new DataTemplate() { VisualTree = stackPanel }); } else { FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock)); textBlock.SetValue(TextBlock.BackgroundProperty, bg); textBlock.SetValue(TextBlock.TextProperty, rowdata.data[Binder].value); return(new DataTemplate() { VisualTree = textBlock }); } } } else { FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBox)); if (rowdata.data.ContainsKey(Binder)) { textBlock.SetValue(TextBox.TextProperty, rowdata.data[Binder].value); } return(new DataTemplate() { VisualTree = textBlock }); } } return(new DataTemplate() { VisualTree = new FrameworkElementFactory(typeof(TextBlock)) }); }
internal void refreshData() { var tag = Tag as string; var issrc = isSrc; FileGrid.Columns.Clear(); var datas = new ObservableCollection <ExcelData>(); if (DirectoryDifferWindow.instance.results != null) { var columns = FileGrid.Columns; var headstr = "filename"; var column = new DataGridTextColumn(); column.Binding = new Binding(headstr); column.Header = headstr; Style aStyle = new Style(typeof(TextBlock)); // 传下去的参数,当渲染格子的时候,只知道行id,需要通过这里传参数知道列id var abinding = new Binding() { Converter = new FileConvertToBackground(), ConverterParameter = new ConverterParamter() { columnID = 1, coloumnName = headstr } }; aStyle.Setters.Add(new Setter(TextBlock.BackgroundProperty, abinding)); column.ElementStyle = aStyle; columns.Add(column); var results = DirectoryDifferWindow.instance.results; for (int j = 0; j < results.Count; j++) { var res = results[j]; if (res.Status != DiffStatus.Equal) { var data = new ExcelData(); data.tag = Tag as string; data.diffIdx = j; // data.diffstatus = results; data.rowId = j; var path = res.Obj1 == null ? res.Obj2 : res.Obj1; var filename = Path.GetFileName(path); data.data["filename"] = new CellData() { value = filename }; datas.Add(data); } } } FileGrid.DataContext = datas; }