1

よく私はこの問題の同様のケースに出くわし、また解決策のアプローチに従いました。しかし、私の場合は非常に奇妙です。2つの異なるDetailsViewコントロール(異なるデータを使用)があり、1つは機能し、もう1つは機能しません。

ここに問題の詳細があります。次のエラーメッセージが表示されます。

DropDownList2 has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value

私はこのスレッドを知っています、そして多分私は愚かで何かを見ていません。しかし、多分あなたはそうします。2つのDetailsviewがあり、1人のユーザーのデータセットに基づいてデータをバインドします。両方のDVには、EditItemTemplates内にDropdownList-Controlsがあり、この列の可能な値をバインドします。2つのDVでまったく同じ方法でDropDownList-templateにSelectedValue='<%#Bind( "mycolumn")%>'を使用します。

すでに述べたように、コードビハインドの回避策は知っていますが、コードをクリーンで一貫性のある状態に保つために、回避策を避けたいと思います。一方のDetailsViewで回避策を使用する理由と、もう一方で回避策を使用しない理由を実際に文書化することはできません。

これが私の2つのDetailsViewsのコードです:

<asp:DetailsView ID="dv_theme_ava" runat="server" Height="50px" Width="125px" AutoGenerateRows="False"
    DataSourceID="SqlDataSource1" DefaultMode="Edit" AutoGenerateEditButton="True"  DataKeyNames="Pat_ID">
    <Fields>
        <asp:TemplateField HeaderText="Theme">
            <EditItemTemplate>
                <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource2"
                    DataTextField="theme" DataValueField="theme" 
                    SelectedValue='<%# Bind("theme") %>'>
                </asp:DropDownList>
                <asp:Label ID="lolbel2" runat="server" Text='<%# Bind("theme") %>'></asp:Label>
                <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:interacct_SQL_convConnectionString %>"
                    SelectCommand="SELECT [theme] FROM [gui_themes]"></asp:SqlDataSource>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Avatar">
            <EditItemTemplate>
                <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSource3"
                    DataTextField="avatar" DataValueField="avatar">
                </asp:DropDownList>
                <asp:Label ID="lolbel" runat="server" Text='<%# Bind("avatar") %>'></asp:Label>
                <asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:interacct_SQL_convConnectionString %>"
                    SelectCommand="SELECT [avatar] FROM [gui_avatars]"></asp:SqlDataSource>
            </EditItemTemplate>
        </asp:TemplateField>
    </Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:interacct_SQL_convConnectionString %>"
    SelectCommand="SELECT * FROM [pat_gui_config] WHERE ([Pat_ID] = @Pat_ID)" DeleteCommand="DELETE FROM [pat_gui_config] WHERE [Pat_ID] = @Pat_ID"
    InsertCommand="INSERT INTO [pat_gui_config] ([Pat_ID], [theme], [avatar]) VALUES (@Pat_ID, @theme, @avatar)"
    UpdateCommand="UPDATE [pat_gui_config] SET [theme] = @theme, [avatar] = @avatar WHERE [Pat_ID] = @Pat_ID">
    <DeleteParameters>
        <asp:Parameter Name="Pat_ID" Type="Int32" />
    </DeleteParameters>
    <InsertParameters>
        <asp:Parameter Name="Pat_ID" Type="Int32" />
        <asp:Parameter Name="theme" Type="String" />
        <asp:Parameter Name="avatar" Type="String" />
    </InsertParameters>
    <SelectParameters>
        <asp:SessionParameter Name="Pat_ID" SessionField="sel_pat_id" Type="Int32" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="theme" Type="String" />
        <asp:Parameter Name="avatar" Type="String" />
        <asp:Parameter Name="Pat_ID" Type="Int32" />
    </UpdateParameters>
</asp:SqlDataSource>


<asp:DetailsView ID="dv_treat_edit" runat="server" AutoGenerateEditButton="True"
    AutoGenerateRows="False" DataKeyNames="Tr_ID" DataSourceID="sql_newcat" DefaultMode="Edit"
    Height="50px" Width="90%" AllowPaging="True" CssClass="dv_details" Style="margin: 0 auto;">
    <Fields>
        <asp:BoundField DataField="Tr_ID" HeaderText="Tr_ID" InsertVisible="False" ReadOnly="True"
            SortExpression="Tr_ID" />
        <asp:BoundField DataField="description" HeaderText="Description" SortExpression="description" />
        <asp:BoundField DataField="syn_ger" HeaderText="Display Name (German)" SortExpression="syn_ger" />
        <asp:TemplateField HeaderText="Type">
            <EditItemTemplate>
                <asp:DropDownList ID="ddl_type0" runat="server" DataSourceID="sql_ddl_type0" DataTextField="type"
                    DataValueField="type" SelectedValue='<%# Bind("type") %>'>
                </asp:DropDownList>
                <asp:SqlDataSource ID="sql_ddl_type0" runat="server" ConnectionString="<%$ ConnectionStrings:interacct_SQL_convConnectionString %>"
                    SelectCommand="SELECT [type] FROM [entry_type]"></asp:SqlDataSource>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Exclusive for Patient_ID">
            <EditItemTemplate>
                <asp:DropDownList ID="ddl_excl_pat0" runat="server" DataSourceID="sql_ddl_exclpat0"
                    DataTextField="Pat_ID" DataValueField="Pat_ID" SelectedValue='<%# Bind("custom_cat_for_Pat") %>'
                    AppendDataBoundItems="true">
                    <asp:ListItem Text="" Value=""></asp:ListItem>
                </asp:DropDownList>
                <asp:SqlDataSource ID="sql_ddl_exclpat0" runat="server" ConnectionString="<%$ ConnectionStrings:interacct_SQL_convConnectionString %>"
                    SelectCommand="SELECT [Pat_ID] FROM [patients]"></asp:SqlDataSource>
            </EditItemTemplate>
        </asp:TemplateField>
    </Fields>
    <CommandRowStyle CssClass="dv_footer" />
    <RowStyle CssClass="dv_tr" />
    <PagerSettings Mode="NumericFirstLast" Position="Top" Visible="False" />
</asp:DetailsView>
<asp:SqlDataSource ID="sql_newcat" runat="server" ConnectionString="<%$ ConnectionStrings:interacct_SQL_convConnectionString %>"
    SelectCommand="SELECT * FROM [treat_cat]" DeleteCommand="DELETE FROM [treat_cat] WHERE [Tr_ID] = @Tr_ID"
    InsertCommand="INSERT INTO [treat_cat] ([description], [syn_ger], [type], [custom_cat_for_Pat]) VALUES (@description, @syn_ger, @type, @custom_cat_for_Pat)"
    UpdateCommand="UPDATE [treat_cat] SET [description] = @description, [syn_ger] = @syn_ger, [type] = @type, [custom_cat_for_Pat] = @custom_cat_for_Pat WHERE [Tr_ID] = @Tr_ID">
    <DeleteParameters>
        <asp:Parameter Name="Tr_ID" Type="Int32" />
    </DeleteParameters>
    <InsertParameters>
        <asp:Parameter Name="description" Type="String" />
        <asp:Parameter Name="syn_ger" Type="String" />
        <asp:Parameter Name="type" Type="String" />
        <asp:Parameter Name="custom_cat_for_Pat" Type="Int32" />
    </InsertParameters>
    <UpdateParameters>
        <asp:Parameter Name="description" Type="String" />
        <asp:Parameter Name="syn_ger" Type="String" />
        <asp:Parameter Name="type" Type="String" />
        <asp:Parameter Name="custom_cat_for_Pat" Type="Int32" />
        <asp:Parameter Name="Tr_ID" Type="Int32" />
    </UpdateParameters>
</asp:SqlDataSource>

注:データモデルは非常に単純です。比較のために、「テーマ」と「タイプ」の2つのフィールドを使用しました。私のデータベースには両方のテーブルに1つの列しかなく、文字列エントリを保持しています。

これで、「type」-DDLはアイテムを完全に正常に取得し、SelectedValueがデータソースによってDetailsViewにもたらされた値にバインドされます。「テーマ」-DDLをSelectedValueにバインドすると、エラーが発生します。興味深い:同じEditItemTemplateで、データバインディングをチェックするためのラベル(ID "lolbel2":p)を設定しました。それは機能します(もちろん、DDLからSelectedValueを削除すると)。したがって、DDLにSelectedValueがない場合、出力は[DROPDOWNLIST]のようになり、項目は「space」、「magic」は[LABEL]、テキストは「magic」になります(これはテストユーザーの値であるため)。

私は何かが足りないのですか?私は完全にナッツですか?ですから、この質問を10回目のように再質問して申し訳ありませんが、私のコードが何をしているのかを理解したいと思います。

前もって感謝します!コンラッド

4

1 に答える 1

0

Ooooohkay。問題を見つけました、それはあなたがヤギとして頑固であるときにあなたが得るものです。:)

HiddenFieldを使用して回避策をデバッグしているときに、Label-Controlと同じ方法でバインドされる値に、末尾に空白があることに気付きました。特に、「犬」の代わりに「犬」を取得しました。これはasp:Labelには表示されませんが、これがDropDownListに値が見つからなかった理由だと思います。

空白はどこから来たのですか?SQLテーブルで、「theme」とアバターの列を「nvarchar」ではなく「nchar」として作成しました。どうやら、DataTypeとして「nchar」を使用する場合、タペルの未使用の文字は空白で埋められます。または、フィールドの幅が固定されているとしましょう(常にx文​​字)。

データ型を「nvarchar」に変更すると、空白を取り除くことができ、DDLのデータバインディングが正常に機能するようになりました。

他の誰かがこれにも遭遇する可能性があるため、私はこれを文書化しています-そして50の解決策と回避策があるので、データベースを見るだけでうまくいくことがあります。

于 2013-03-25T12:01:05.157 に答える