0

私はGridViewを持っています。ドロップダウン値を選択した後に LinkBut​​ton をクリックすると、ドロップダウンの最初の項目のみが取得されます。選択した値を TextBox に表示する必要があります。どうすれば目的の値を取得できますか? これは私の擬似コードです:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" EnableModelValidation="True"
                OnRowDataBound="GridView1_RowDataBound">
                <Columns>
                    <asp:TemplateField HeaderText="ID">
                        <ItemTemplate>
                            <asp:Label ID="Label1" runat="server" Text='<%#Eval("ID")%>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Count">
                        <ItemTemplate>
                            <asp:DropDownList ID="DropDownList1" runat="server" EnableViewState="true" AutoPostBack="false">
                            </asp:DropDownList>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="Button">
                        <ItemTemplate>
                            <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">LinkButton</asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>

そして背後にあるコード:

protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("ID", typeof(string));
        dt.Columns.Add("Count", typeof(string));
        dt.Rows.Add("A", "5");
        dt.Rows.Add("B", "8");
        dt.Rows.Add("C", "4");
        dt.Rows.Add("D", "7");
        dt.Rows.Add("E", "9");
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DropDownList ddl = (DropDownList)e.Row.FindControl("DropDownList1");
            ddl.Items.Clear();
            int count = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Count").ToString());
            List<string> list = new List<string>();
            for (int i = 1; i <= count; i++)
            {
                list.Add(i.ToString());
            }
            ddl.DataSource = list;
            ddl.DataBind();
        }
    }

    protected void LinkButton1_Click(object sender, EventArgs e)
    {
        GridViewRow grdrow = (GridViewRow)((LinkButton)sender).NamingContainer;
        DropDownList ddl = (DropDownList)GridView1.Rows[grdrow.RowIndex].FindControl("DropDownList1");
        TextBox1.Text = ddl.SelectedValue.ToString();
    }

前もって感謝します...

4

3 に答える 3

0

ドロップダウンリストを動的に作成してバインドしているため、クリックイベントが実行された時点ではロードされていません。バインドされたプロパティ (selectedValueこの場合はプロパティ) を使用するには、コントロールが既に読み込まれている必要があり、そのビューステート情報はコントロールによって解析および設定されます。

ドロップダウン リストを作成するデータ バインディング イベントは、事前レンダリング後に実行されます。ページのライフサイクルの詳細については、 http://msdn.microsoft.com/en-us/library/ms178472%28v=vs.85%29.aspxを参照してください。

あなたが求めていることを行うには、ページのライフサイクルに細心の注意を払う必要があります。テキストボックスを設定するコードをGridView1_RowDataBoundメソッドに移動してみてください。ただし、これを機能させるには、コントロールを毎回同じプロパティでレンダリングする必要があります (これにより、コントロール上のイベントが正しく接続され、selectedValue プロパティが正しく設定されます)。

もう 1 つの方法は、テキスト ボックスまたはドロップダウン リスト自体でイベントを処理することです。ここでも、コントロールのプロパティとライフサイクルに注意を払う必要があります。

ASP.Net Forms は SmartUI パターンを使用していますが、これはこのパターンに対する唯一の最大の欠点です。

于 2014-07-02T22:10:27.850 に答える
0

わかりました、これを試してください

protected void LinkButton1_Click(object sender, EventArgs e)
{
  LinkButton lnkBtn = (LinkButton)sender;
  GridViewRow row = (GridViewRow)lnkBtn.NamingContainer;
  DropDownList ddl= (DropDownList)row.FindControl("DropDownList1");
  TextBox1.Text = ddl.SelectedValue.ToString();
}
于 2014-07-02T22:24:41.747 に答える