0

編集モードに入ると、列の1つがドロップダウンリストに変わるグリッドビューがあります。

     <EditItemTemplate>
          <asp:DropDownList ID="DropDownList2" runat="server" 
          DataSourceID="SqlDataSource1" DataTextField="name" DataValueField="name">
          </asp:DropDownList>
     </EditItemTemplate>

今、私はSqlDataSourceこのaspxファイルで定義するwithupdateメソッドを持っています:

<UpdateParameters>
       <asp:Parameter Name="name" Type="String" />
       <asp:ControlParameter ControlID="DropDownList2" Type="string" 
                PropertyName="SelectedValue" Name="genre" />
</UpdateParameters>

選択した値を取得して挿入したいのですが、グリッドビューの行にある[更新]ボタンを押すと、次のエラーが発生します。

Could not find control 'DropDownList2' in ControlParameter 'genre'

なぜそれが起こるのか分かりますか?

4

1 に答える 1

1

はい。ControlParametersDOMが、の同じブランチ内にある参照しているコントロールを検出できる場合にのみ機能しますGridView。問題は、EDITモードのようにGridViewの「モード」に入るとすぐに、DOM構造全体が変更されるため、GridviewはDOMコントロールを処理するための不適切な方法であるということです。ちなみに、DOMはドキュメントオブジェクトモデルです。変更されているため、ASPは参照しているコントロールを見つけることができません。

私は2つのことのうちの1つをすることによってこれを克服しました。

まず、コントロール名を'$'文字でテール化するだけで機能するかどうかを確認します。

<UpdateParameters>
       <asp:Parameter Name="name" Type="String" />
       <asp:ControlParameter ControlID="MyGridView$DropDownList2" Type="string" 
                PropertyName="SelectedValue" Name="genre" />
</UpdateParameters>

運が良ければ、これは時々機能します。

そうでない場合は、コントロールを見つけてその値を取得し、コードビハインドでプログラムによってSQLパラメーターに渡す必要があります。

このようなものを試してください(私はC#を使用しています)...

protected void MyGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
   ...
   GridViewRow gvRow = (GridViewRow)sender;
   DropDownList myDDL = (DropDownList)gvRow.FindControl("DropDownList2");
   if (myDDL != null)
   {
      //assuming your datasource is outside the gridview, you have to find it!
      SqlDataSource sds1 = (SqlDataSource)page.FindControl("myDataSource");
      if (sds1 != null)
      {
         sds1.UpdateParameter["genre"].DefaultValue = myDDL.SelectedValue;
         ... and do your databinding etc
         sds1.Update();
      }
   }
}

私は常にクライアント側のコード(ASPX)に依存して、、などのほとんどの作業を行ってBind()Eval()ますが、時間の経過とともに、プログラムを実際に制御するには、JavaScriptまたはコードに依存する必要があることに気付くでしょう。より細かいビットを実行するために背後にあります。ASPは、期待どおりのことを行うのに常に「賢い」とは限りません。

于 2018-04-10T06:52:36.260 に答える