アイテムを表示、編集、および MSSQL データベースに挿入するために使用される FormView があります。FormView は LinqDataSource に接続されており、そのSelecting
イベントを使用して、クエリ文字列で渡されたパラメーター (列) に基づいて FormView に表示されるデータをフィルター処理します。
FormView には、関連テーブルの値を表示する DropDownList があります。編集しようとする場合を除いて、すべてが正常に機能します-何らかの理由で、編集を保存しようとすると(値が選択されている場合でも)、DropDownList の選択された値は常に空になります。インサートは正常に機能します。
Selecting
フィルタリングを行うイベントまで問題を追跡しました。フィルタリングを行うメソッドをコメントアウトすると、アイテムは正常に更新されますが、フィルタリングによって更新が中断される理由がわかりません。
これが私の(短縮された)FormViewです:
<asp:FormView ID="fvData" runat="server" AllowPaging="True"
DataKeyNames="ID" DataSourceID="ldsData"
ondatabound="fvData_DataBound">
<EditItemTemplate>
<table class="pad5">
<tr>
<td class="field-name">AREA:</td>
<td><asp:DropDownList ID="cboAREA" runat="server" DataTextField="AREA_NAME" DataValueField="AREA1" SelectedValue='<%# Bind("AREA") %>' DataSourceID="ldsAreas" /></td>
</tr>
<tr>
<td class="field-name">LOOP:</td>
<td><asp:TextBox ID="txtLOOP" runat="server" Text='<%# Bind("LOOP") %>' /></td>
</tr>
<tr>
<td class="field-name">LOOP DESCRIPTION:</td>
<td><asp:TextBox ID="txtLOOP_DESCRIPTION" runat="server"
Text='<%# Bind("LOOP_DESCRIPTION") %>' style="width: 600px" /></td>
</tr>
</table>
<asp:Button ID="btnUpdate" runat="server" Text="Update" CommandName="Update" CausesValidation="True" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" CommandName="Cancel" CausesValidation="False" />
</EditItemTemplate>
<InsertItemTemplate>
<table class="pad5">
<tr>
<td class="field-name">AREA:</td>
<td>
<asp:DropDownList ID="cboAREA" runat="server" DataTextField="AREA_NAME"
DataValueField="AREA1" SelectedValue='<%# Bind("AREA") %>' AppendDataBoundItems="true" DataSourceID="ldsAreas">
<asp:ListItem Text="" Value="" />
</asp:DropDownList>
</td>
</tr>
<tr>
<td class="field-name">LOOP:</td>
<td><asp:TextBox ID="txtLOOP" runat="server" Text='<%# Bind("LOOP") %>' /></td>
</tr>
<tr>
<td class="field-name">LOOP DESCRIPTION:</td>
<td><asp:TextBox ID="txtLOOP_DESCRIPTION" runat="server"
Text='<%# Bind("LOOP_DESCRIPTION") %>' style="width: 600px" /></td>
</tr>
</table>
<asp:Button ID="btnInsert" runat="server" Text="Insert" CommandName="Insert" CausesValidation="True" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" CommandName="Cancel" CausesValidation="False" />
</InsertItemTemplate>
</asp:FormView>
LinqDataSource:
<asp:LinqDataSource ID="ldsData" runat="server"
ContextTypeName="E_and_I.EAndIDataDataContext" EnableDelete="True"
EnableInsert="True" EnableUpdate="True" EntityTypeName=""
TableName="INSTRUMENT_LOOP_DESCRIPTIONs" onselecting="ldsData_Selecting" OrderBy="ID ASC" >
</asp:LinqDataSource>
私のldsData_Selecting
方法:
protected void ldsData_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
EI.FilterData<INSTRUMENT_LOOP_DESCRIPTION>(ref e, db.INSTRUMENT_LOOP_DESCRIPTIONs, this.db);
}
そして最後にEI.FilterData
:
public static void FilterData<T>(ref LinqDataSourceSelectEventArgs e, IEnumerable<T> source, EAndIDataDataContext db)
{
if (HttpContext.Current.Request.QueryString.Keys.Count > 0)
{
var result = source.AsQueryable();
bool filtered = false;
// get column names
var columnNames = db.Mapping.MappingSource.GetModel(typeof(EAndIDataDataContext)).GetMetaType(typeof(T)).DataMembers;
foreach (string key in HttpContext.Current.Request.QueryString.Keys)
{
string val = HttpContext.Current.Request.QueryString[key];
// check the query string key exists as a column in the table, etc
if (columnNames.SingleOrDefault(c => c.Name == key) != null && val.Trim() != "" && val != "*")
{
result = result.WhereLike(key, val.Replace("?", "_").Replace("*", "%"));
filtered = true;
}
}
if (filtered)
e.Result = result;
}
}
結果をフィルタリングすると更新が中断される理由はありますか (そして、DropDownList のみ - テキストボックスは正常に動作します)? フィルタリングは完全に機能します (つまり、FormView は、ユーザーが入力したレコード ベースのパラメーターのみを表示します)。WhereLike
拡張メソッドが何をするのか疑問に思っている場合は、この質問の回答を確認してください。