1

GridView で行を編集する場合、使用可能な値のリストが行内の他の列に依存する DropDownList が必要です (ここでは、レコードの「タイプ」とだけ言っておきましょう)。つまり、編集中の行に応じて異なるオプションが表示されます。

そうでなければ不要な DataKeyName を GridView に追加することで、ファッションの後に機能するようになりましたが、これは他の場所で悲しみを引き起こし、とにかく遠回りすぎると感じるので、より良い方法を探しています。これが私が現在行っている方法です:

.aspx ファイル:

<asp:GridView ID="gvDct" ... DataKeyNames="dctId,dctType" ... >
  ...
  <asp:TemplateField>
    ...
    <EditItemTemplate>
      <asp:DropDownList ID="ddlDctParent" runat="server" 
             DataSourceId="sdsDctParent" 
             DataValueField="dctId" DataTextField="dctFullPath" 
             SelectedValue='<%# Bind("dctParentId") %>' 
             ... >
      </asp:DropDownList>
      <asp:SqlDataSource ID="sdsDctParent" runat="server" 
             ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
             OnSelecting="sdsDctParent_Selecting" 
             SelectCommand="SELECT dctId, dctFullPath FROM lkpDocCatAndType 
                            WHERE dctType=@dctType">
        <SelectParameters>
          <asp:Parameter Name="dctType" />
        </SelectParameters>
      </asp:SqlDataSource>
    </EditItemTemplate>
  </asp:TemplateField>
  ...
</asp:GridView>

SelectParameter を ControlID="gvDct" および PropertyName="SelectedDataKey.Values[dctType]" の ControlParameter にしたかったのですが、不明な理由で機能しませんでした (パラメーター値が null でした)。 .vb コード ビハインド ファイルを使用して、DropDownList のデータ ソースの行固有のパラメーターを設定します。

Protected Sub sdsDctParent_Selecting(ByVal sender As Object, _
          ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs)
  e.Command.Parameters(0).Value = gvDct.DataKeys(gvDct.EditIndex).Item(1)
End Sub

そのため、GridView で行の編集を開始すると、DropDownList がバインドされ、SqlDataSource SelectCommand が実行され、編集中の行 (EditIndex) からパラメーター値を提供する OnSelecting コードが起動され、適切なDropDownList の値の母集団。

「より良い」方法はありますか?私にとって最も重要な側面は、DataKeyName を追加しないようにすることです。これは、GridView から行を削除するために使用しているストアド プロシージャでパラメーターが多すぎる問題を引き起こしているためです。

4

1 に答える 1

0

RowDataBound後で valueID を取得できるGridview を使用する必要があります。C # でコードを記述するために、ドロップダウンリスト Sry に値を入力するフィールドをDropdownlist 追加することもできます。label/hidden

このようなものを試すことができます

protected void gvDct_RowDataBound(object sender, GridViewRowEventArgs e)
{
 if (e.Row.RowType == DataControlRowType.DataRow)
  {
   if ((e.Row.RowState & DataControlRowState.Edit) > 0)
     {
      Label  lblValue = (Label)e.Row.FindControl("YourLableID")
      DropDownList ddList= (DropDownList)e.Row.FindControl("ddlDctParent");
      //bind dropdownlist
      DataTable dt = con.GetData("Select Query where YourColumn='"+lblValue.text+"'");
      ddList.DataSource = dt;
      ddList.DataTextField = "dctFullPath";
      ddList.DataValueField = "dctId";
      ddList.DataBind();

      DataRowView dr = e.Row.DataItem as DataRowView;
      ddList.SelectedValue = dr["dctId"].ToString();
     }
   }
 }
于 2013-05-18T11:32:34.287 に答える