7

実行時にバインドされるグリッドビューのコードは次のとおりです。

...
<asp:templatefield>
    <edititemtemplate>
        <asp:dropdownlist runat="server" id="ddgvOpp" />
    </edititemtemplate>
    <itemtemplate>
        <%# Eval("opponent.name") %>
    </itemtemplate>
</asp:templatefield>
...

ドロップダウンリスト「ddgvOpp」をバインドしたいのですが、方法がわかりません。すべきですが、しません。これが私が持っているものですが、「オブジェクト参照」エラーが発生し続けます。これは理にかなっています:

protected void gvResults_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow) //skip header row
    {
        DropDownList ddOpp = (DropDownList)e.Row.Cells[5].FindControl("ddgvOpp");
        BindOpponentDD(ddOpp);
    }
}

BindOpponentDD()DropDownList が設定される場所はWhereです。適切なイベントでこれを行っていませんか? そうでない場合、どれに入れる必要がありますか?

事前にどうもありがとう...

4

5 に答える 5

5

わかりました、私はただ馬鹿だと思います。私はそれを考え出した。

RowDataBoundイベントで、次の条件を追加するだけです。

if (myGridView.EditIndex == e.Row.RowIndex)
{
     //do work
}
于 2008-10-05T16:27:52.950 に答える
2

Saurabh Tripathi のおかげで、

あなたが提供した解決策は私にとってうまくいきました。gridView_RowDataBound() イベントで使用します。

if(gridView.EditIndex == e.Row.RowIndex && e.Row.RowType == DataControlRowType.DataRow)
{
    // FindControl
    // And populate it
}

誰かが同じ問題で立ち往生している場合は、これを試してください。

乾杯。

于 2012-01-02T16:24:21.933 に答える
1
protected void grdDevelopment_RowDataBound(object sender, GridViewRowEventArgs e)
{
   if (grdDevelopment.EditIndex == e.Row.RowIndex && e.Row.RowType==DataControlRowType.DataRow) 
   {       
       DropDownList drpBuildServers = (DropDownList)e.Row.Cells[0].FindControl("ddlBuildServers"); 
   }
}

これを試してみてください

これはあなたを助けます

于 2009-07-29T06:19:26.607 に答える
1

私は同じ問題を抱えていましたが、この修正 (ハンドラーに条件を追加するジェイソンのもの) はうまくいきませんでした。Edit 行はデータバインドされていないため、条件が true と評価されることはありません。RowDataBound は、GridView.EditIndex と同じ RowIndex で呼び出されることはありません。ただし、ドロップダウンをプログラムでバインドする代わりに、ページの ObjectDataSource にバインドするという点で、私のセットアップは少し異なります。ただし、可能な値は行内の他の情報に依存するため、ドロップダウンは行ごとに個別にバインドする必要があります。したがって、ObjectDataSource には SessionParameter があり、バインドに必要な場合は適切なセッション変数を設定するようにします。

<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName">
<SelectParameters>
    <asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" />
</SelectParameters>

関連する行のドロップダウン:

<asp:TemplateField HeaderText="My Info" SortExpression="MyInfo">
        <EditItemTemplate>
            <asp:DropDownList ID="ddlEditMyInfo" runat="server" DataSourceID="objInfo" DataTextField="MyInfo" DataValueField="MyInfoID" SelectedValue='<%#Bind("ID") %>' />
        </EditItemTemplate>
        <ItemTemplate>
            <span><%#Eval("MyInfo") %></span>
        </ItemTemplate>
    </asp:TemplateField>

私がやったことは、GridView で CommandField を使用して、編集、削除、更新、およびキャンセル ボタンを生成することではありませんでした。私は TemplateField を使用して自分でそれを行い、CommandNames を適切に設定することで、GridView で組み込みの編集/削除/更新/キャンセル アクションをトリガーすることができました。[編集] ボタンでは、通常の行の PK ではなく、ドロップダウンをバインドするために必要な情報を CommandArgument にしました。幸いなことに、これは GridView が適切な行を編集することを妨げませんでした。

<asp:TemplateField>
        <ItemTemplate>
            <asp:ImageButton ID="ibtnDelete" runat="server" ImageUrl="~/images/delete.gif" AlternateText="Delete" CommandArgument='<%#Eval("UniqueID") %>' CommandName="Delete" />
            <asp:ImageButton ID="ibtnEdit" runat="server" ImageUrl="~/images/edit.gif" AlternateText="Edit" CommandArgument='<%#Eval("MyID") %>' CommandName="Edit" />
        </ItemTemplate>
        <EditItemTemplate>
            <asp:ImageButton ID="ibtnUpdate" runat="server" ImageUrl="~/images/update.gif" AlternateText="Update" CommandArgument='<%#Eval("UniqueID") %>' CommandName="Update" />
            <asp:ImageButton ID="ibtnCancel" runat="server" ImageUrl="~/images/cancel.gif" AlternateText="Cancel" CommandName="Cancel" />
        </EditItemTemplate>
    </asp:TemplateField>

そして、RowCommand ハンドラーで:

void grdOverrides_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Edit")
                Session["MID"] = Int32.Parse(e.CommandArgument.ToString());
        }

もちろん、RowCommand は、行が編集モードになる前、つまりドロップダウン データバインドの前に発生します。したがって、すべてが機能します。ちょっとハックですが、編集行がまだデータバインドされていない理由を突き止めるのに十分な時間を費やしました。

于 2011-01-26T17:09:12.090 に答える
0

このコードはあなたが望むことをします:

<asp:TemplateField HeaderText="garantia" SortExpression="garantia">
 <EditItemTemplate>
   <asp:DropDownList ID="ddgvOpp" runat="server" SelectedValue='<%# Bind("opponent.name") %>'>
       <asp:ListItem Text="Si"  Value="True"></asp:ListItem>
       <asp:ListItem Text="No" Value="False"></asp:ListItem>
   </asp:DropDownList>
 </EditItemTemplate>
 <ItemTemplate>
   <asp:Label ID="Label1" runat="server" Text='<%# Bind("opponent.name") %>'></asp:Label>
 </ItemTemplate>
于 2014-02-04T07:35:20.007 に答える