diff --git a/插件库/Lskj.Control/GridControlEx.ExtendedReturn.cs b/插件库/Lskj.Control/GridControlEx.ExtendedReturn.cs index 1a54285..134f5b1 100644 --- a/插件库/Lskj.Control/GridControlEx.ExtendedReturn.cs +++ b/插件库/Lskj.Control/GridControlEx.ExtendedReturn.cs @@ -38,6 +38,8 @@ namespace Lskj.Control new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly Dictionary mExtendedReturnSchemas = new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary mExtendedReturnSchemaSqls = + new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly Dictionary mExtendedReturnDisplayFields = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly Dictionary mExtendedReturnQueryStates = @@ -70,8 +72,10 @@ namespace Lskj.Control public DateTime DueTime; public string FieldName; public string Keyword; + public string SearchField; public string SourceSql; public string ConnectionString; + public bool SchemaOnly; public GridColumnModel Model; public PopupContainerEdit Editor; public ExtendedReturnPopupContext PopupContext; @@ -80,6 +84,7 @@ namespace Lskj.Control private sealed class ExtendedLookupQueryResult { + public DataTable Schema; public DataTable Table; public Exception Error; } @@ -340,9 +345,31 @@ namespace Lskj.Control string actualValueText = GetExtendedReturnBusinessValueText(context); context.Popup.PrepareForOpen(); + string sourceSql = ResolveExtendedReturnSourceSql(model, context.BusinessRow); + DataTable cachedSchema = TryGetExtendedReturnSchema(model.FieldName, sourceSql); + if (cachedSchema != null) + { + ConfigureExtendedReturnSearchColumns(context, cachedSchema); + } if (actualValueText.Length > 0) { - StartExtendedReturnSearch(context, actualValueText); + QueueExtendedReturnSearch( + context.OwnerEdit, + context, + sourceSql, + actualValueText, + string.Empty, + false); + } + else if (cachedSchema == null) + { + QueueExtendedReturnSearch( + context.OwnerEdit, + context, + sourceSql, + string.Empty, + string.Empty, + true); } else { @@ -426,7 +453,7 @@ namespace Lskj.Control try { - StartExtendedReturnSearch(context, popup.SearchText); + StartExtendedReturnSearch(context, popup.SearchText, popup.SelectedSearchField); } catch (Exception ex) { @@ -434,18 +461,27 @@ namespace Lskj.Control } } - private void StartExtendedReturnSearch(ExtendedReturnPopupContext context, string keyword) + private void StartExtendedReturnSearch( + ExtendedReturnPopupContext context, + string keyword, + string searchField) { if (context == null || context.Model == null || context.OwnerEdit == null) return; keyword = (keyword ?? string.Empty).Trim(); CancelExtendedReturnSearch(context.Model.FieldName); - context.Popup.ResultGrid.DataSource = null; + context.Popup.ClearResultAndFilter(); if (keyword.Length == 0) return; ValidateExtendedReturnBusinessConfiguration(context.Model, context.BusinessRow); string sourceSql = ResolveExtendedReturnSourceSql(context.Model, context.BusinessRow); - QueueExtendedReturnSearch(context.OwnerEdit, context, sourceSql, keyword); + QueueExtendedReturnSearch( + context.OwnerEdit, + context, + sourceSql, + keyword, + searchField, + false); } private void ExtendedReturnSearch_ClearRequested(object sender, EventArgs e) @@ -622,7 +658,9 @@ namespace Lskj.Control PopupContainerEdit edit, ExtendedReturnPopupContext context, string sourceSql, - string keyword) + string keyword, + string searchField, + bool schemaOnly) { GridColumnModel model = context.Model; ExtendedLookupRequest request; @@ -636,8 +674,10 @@ namespace Lskj.Control DueTime = DateTime.UtcNow, FieldName = model.FieldName, Keyword = keyword, + SearchField = searchField, SourceSql = sourceSql, ConnectionString = SqlHelper._connection.ConnectionString, + SchemaOnly = schemaOnly, Model = model, Editor = edit, PopupContext = context, @@ -781,13 +821,18 @@ namespace Lskj.Control try { DataTable schema = GetExtendedReturnSchema(request.FieldName, request.SourceSql, request.ConnectionString); + result.Schema = schema; IList mappings = ExtendedReturnSupport.ParseResultFields(request.Model.ResultFields); ValidateExtendedReturnSourceColumns(schema.Columns, request.Model, mappings); - string searchSql = ExtendedReturnSupport.BuildSearchSql(request.SourceSql, schema.Columns, ExtendedLookupMaxRows); - result.Table = ExecuteExtendedReturnQuery( - searchSql, - ExtendedReturnSupport.BuildLikeParameterValue(request.Keyword), - request.ConnectionString); + if (!request.SchemaOnly) + { + string searchSql = ExtendedReturnSupport.BuildSearchSql( + request.SourceSql, schema.Columns, ExtendedLookupMaxRows, request.SearchField); + result.Table = ExecuteExtendedReturnQuery( + searchSql, + ExtendedReturnSupport.BuildLikeParameterValue(request.Keyword), + request.ConnectionString); + } } catch (Exception ex) { @@ -802,7 +847,13 @@ namespace Lskj.Control lock (mExtendedReturnSyncRoot) { DataTable cachedSchema; - if (mExtendedReturnSchemas.TryGetValue(fieldName, out cachedSchema)) return cachedSchema; + string cachedSql; + if (mExtendedReturnSchemas.TryGetValue(fieldName, out cachedSchema) && + mExtendedReturnSchemaSqls.TryGetValue(fieldName, out cachedSql) && + string.Equals(cachedSql, sourceSql, StringComparison.Ordinal)) + { + return cachedSchema; + } schemaGeneration = mExtendedReturnSchemaGeneration; } @@ -810,15 +861,38 @@ namespace Lskj.Control lock (mExtendedReturnSyncRoot) { DataTable cachedSchema; - if (mExtendedReturnSchemas.TryGetValue(fieldName, out cachedSchema)) return cachedSchema; + string cachedSql; + if (mExtendedReturnSchemas.TryGetValue(fieldName, out cachedSchema) && + mExtendedReturnSchemaSqls.TryGetValue(fieldName, out cachedSql) && + string.Equals(cachedSql, sourceSql, StringComparison.Ordinal)) + { + return cachedSchema; + } if (schemaGeneration == mExtendedReturnSchemaGeneration) { mExtendedReturnSchemas[fieldName] = schema; + mExtendedReturnSchemaSqls[fieldName] = sourceSql; } } return schema; } + private DataTable TryGetExtendedReturnSchema(string fieldName, string sourceSql) + { + lock (mExtendedReturnSyncRoot) + { + DataTable cachedSchema; + string cachedSql; + if (mExtendedReturnSchemas.TryGetValue(fieldName, out cachedSchema) && + mExtendedReturnSchemaSqls.TryGetValue(fieldName, out cachedSql) && + string.Equals(cachedSql, sourceSql, StringComparison.Ordinal)) + { + return cachedSchema; + } + return null; + } + } + private static DataTable ExecuteExtendedReturnQuery( string commandText, string keywordParameterValue, @@ -870,11 +944,13 @@ namespace Lskj.Control if (state.Version != request.Version) return; } + ConfigureExtendedReturnSearchColumns(request.PopupContext, result.Schema); if (result.Error != null) { MessageUtil.Show("扩展搜索查询失败:" + result.Error.Message); return; } + if (request.SchemaOnly) return; lock (mExtendedReturnSyncRoot) { @@ -904,6 +980,27 @@ namespace Lskj.Control } } + private void ConfigureExtendedReturnSearchColumns( + ExtendedReturnPopupContext context, + DataTable sourceSchema) + { + if (context == null || context.Popup == null || context.Model == null || sourceSchema == null) return; + + ExtendedReturnSearchPopup popup = context.Popup; + List> options = new List>(); + IList mappings = + ExtendedReturnSupport.ParseResultFields(context.Model.ResultFields); + foreach (DataColumn column in sourceSchema.Columns) + { + if (!ExtendedReturnSupport.IsSearchableColumn(column.ColumnName)) continue; + + options.Add(new KeyValuePair( + column.ColumnName, + GetExtendedReturnColumnCaption(column.ColumnName, mappings))); + } + popup.SetSearchColumns(options); + } + private void ConfigureExtendedReturnViewColumns(ExtendedReturnPopupContext context, DataTable table) { if (context == null || context.Popup == null || table == null || context.Model == null) return; @@ -972,7 +1069,7 @@ namespace Lskj.Control } context.OwnerEdit.EditValue = null; - context.Popup.ResultGrid.DataSource = null; + context.Popup.ClearResultAndFilter(); if (context.OwnerEdit.IsPopupOpen) context.OwnerEdit.ClosePopup(); this.GridView.PostEditor(); this.GridView.UpdateCurrentRow(); @@ -1002,7 +1099,7 @@ namespace Lskj.Control ExtendedReturnPopupContext context = GetExtendedReturnPopupContext(model.FieldName); CancelExtendedReturnSearch(model.FieldName); SetExtendedReturnEditorBusinessValue(context); - context.Popup.ResultGrid.DataSource = null; + context.Popup.ClearResultAndFilter(); this.GridView.RefreshRow(this.GridView.FocusedRowHandle); } catch (Exception ex) @@ -1192,12 +1289,13 @@ namespace Lskj.Control lock (mExtendedReturnSyncRoot) { mExtendedReturnSchemas.Clear(); + mExtendedReturnSchemaSqls.Clear(); mExtendedReturnSchemaGeneration++; } foreach (ExtendedReturnPopupContext context in mExtendedReturnPopupContexts.Values) { - context.Popup.ResultGrid.DataSource = null; + context.Popup.ClearResultAndFilter(); } }