5

私のアプリケーションでは、グリッドビューで行を編集するときに、ドロップダウン リストから新しいデータを選択します。

私は次のようにドロップダウンを設定しています:

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            if ((e.Row.RowState & DataControlRowState.Edit) > 0)
            {
                DropDownList emailsListDL = (DropDownList)e.Row.FindControl("emailsDL");
                emailsListDL.DataSource = allUsersEmails;//list of strings with the emails of the users
                emailsListDL.DataBind();
            }
        }
    }

しかし、テンプレートから「更新」ボタンを押して「RowUpdating」イベントに入ると、ドロップダウンリストから選択された値は毎回そのドロップダウンリストの最初の値になります。

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        DropDownList emailsListDL = (DropDownList)GridViewAdvertisers.Rows[e.RowIndex].FindControl("emailsDL");
        string email = emailsListDL.SelectedValue; //the selected value is every time the first value from the dropdownlist
    }

誰にもアイデアはありますか?

「RowDataBound」イベントで選択した値を設定する方法をたくさん試しましたが、うまくいきませんでした。私はこれを試しました:

1. emailsListDL.SelectedIndex = emailsListDL.Items.IndexOf(emailsListDL.Items.FindByValue(DataBinder.Eval(e.Row.DataItem, "OwnerMail").ToString()));
2. emailsListDL.SelectedValue = GridViewAdvertisers.DataKeys[e.Row.RowIndex]["OwnerMail"].ToString();
3. emailsListDL.SelectedValue = GridViewAdvertisers.Rows[e.Row.RowIndex].Cells[1].Text;
//ownerMail is a string (object) from the list of objects that I put as datasource to the gridview

ありがとう、ジェフ

アップデート

aspx ページの My Item テンプレートは次のとおりです。

 <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle"
                ItemStyle-Width="150px" HeaderText="Owner Email" HeaderStyle-HorizontalAlign="Left"
                HeaderStyle-BorderWidth="1px" HeaderStyle-BorderColor="#e1e1e1">
                <ItemTemplate>
                    <asp:Label ID="LabelEmail" runat="server" Text='<%# Bind("OwnerMail")%>'></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="emailsDL" runat="server" Width="150">
                    </asp:DropDownList>
                </EditItemTemplate>
                <HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Font-Bold="True"></HeaderStyle>
                <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" Width="180px" BorderWidth="1px"
                    BorderColor="#e1e1e1"></ItemStyle>
    </asp:TemplateField>
4

4 に答える 4

1

SelectedIndex は、DropDownList 定義で定義しない場合、常にデフォルトで 0 になります。

編集: @Tim Schmelter は、彼のコメントを回答として追加する必要があります。それまでの間、他の読者のために言い換えます: ポストバックを確認する必要があります (上記のコメントを参照)。

于 2011-05-12T13:55:39.907 に答える
0

RowDataBound-Eventで選択された値を設定するには、次のように設定する必要があります。

(DropDownList)e.Row.Cells[/*index*/].Controls[/*index, or use FindControl*/]).Items.FindByValue(((DataRowView)e.Row.DataItem).Row.ItemArray[/*columnnumber*/].ToString()).Selected = true;

FindByValueは、「通常の」ビューモードでフィールドの現在のTextvalueを検索し、DropDownListに値を設定します。

もちろん、これはカプセル化する必要があります

if ((e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit)
{
}

あなたの「更新時に価値を得る」-問題に関しては、あなたのアプローチは私のものとまったく同じであるため、私には手がかりがないことを正直に言わなければなりません。違いは私のものだけです。

それが助けになるなら、これが私のコードです:

 protected void gridVariables_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        string control = ((DropDownList)gridVariables.Rows[e.RowIndex].Cells[3].Controls[1]).SelectedValue;
        gridVariables.EditIndex = -1;
        this.gridVariables_DataBind(control, e.RowIndex);
    }

private void gridVariables_DataBind(string control, int index)
    {
        DataTable dt = (DataTable)Session["variableTable"]; //features a DataTable with the Contents of the Gridview
        dt.Rows[index]["ControlType"] = control;
        gridVariables.DataSource = dt;
        gridVariables.DataBind();
    }
于 2011-05-13T07:13:16.977 に答える
0

aを宣言ComboBox mainBX = new Combobox(); することも、イベントを宣言することもできます

private void onSeletedIndexChange(object sender,EventArgs e)
{
        mainBX = (ComboBox)(sender);
}

次に、GridView で foreach ComboBox を反復処理し、この Event を追加する必要があります。あなたがすべきことは、mainBX.selectedItem(); を取ることだけです。

申し訳ありませんが、これはあなたが必要としているものだと思います。

于 2011-05-12T19:10:02.773 に答える
0

私は別のソリューションで同じ問題を抱えていました。カスタム ページャーを使用して GridView にカスタム ページングを実装し、その過程で、新しいページ インデックスでグリッドを再バインドする RowCommand メソッドを追加しました。ただし、更新中に RowCommand メソッドも呼び出されます。

そのため、コード内のどこかにバインドしている可能性のある他の場所を必ず確認してください。これが他の誰かに役立つことを願っています。

protected void GridView1_RowCommand(オブジェクト送信者, GridViewCommandEventArgs e)
{
    文字列 commandName = e.CommandName;

    スイッチ (コマンド名)
        {
            ケース "Page1":
                HandlePageCommand(e);
                //バインディングはここで行う必要があります
                壊す;
        }

        // この行が間違った場所にあるため、バグが発生します    
        BindGrid1();
}
于 2013-08-13T23:51:03.563 に答える