在Dropdown上从GridView更新已更改

时间:2009-09-11 21:05:28

标签: c# asp.net gridview

我有一个GridView控件,我希望有2个可见字段,一个标签和一个下拉列表。我没有使用RowEditTemplate,而是希望将ItemTemplate定义为下拉值。

如果下拉列表发生更改,我想执行一些代码,我可以获取该gridview行的整数键以及下拉列表的新选定值。如下所示:

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="pk_id" onrowdeleting="GridView2_RowDeleting" 
        onrowcommand="GridView2_RowCommand">
        <Columns>
            <asp:BoundField DataField="pk_id" Visible="False" />
            <asp:BoundField DataField="Column1" HeaderText="Column1" />
            <asp:TemplateField HeaderText="Column2">
                <ItemTemplate>
                    <asp:DropDownList ID="DropDownList3" runat="server" 
                        DataSourceID="SqlDataSource" DataTextField="name" 
                        DataValueField="id2"
                        SelectedValue='<%# Bind("id2") %>' 
                        AutoPostBack="True">
                    </asp:DropDownList>
                    <asp:SqlDataSource ID="SqlDataSource" runat="server" 
                        ConnectionString="<%$ ConnectionStrings:Main %>" 
                        SelectCommand="get_TestData" SelectCommandType="StoredProcedure">
                    </asp:SqlDataSource>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:CommandField ShowDeleteButton="True" />
        </Columns>
    </asp:GridView>

代码背后

protected void Page_Load(object sender, EventArgs e)
{
    ...
    GridView2.DataSource = new Person(id).GetDataSet();
    GridView2.DataBind();
}
protected void GridView2_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    // Call delete function with the key
    // Delete(key);
}
protected void GridView2_RowCommand(object sender, GridViewCommandEventArgs e)
{
    // figure out which row sent it
    // UpdateRecord(key, newvalue)
}

填充下拉列表并正确选择值,但我无法通过下拉列表进行删除或更新以使其正常工作。我尝试过实现这些函数,但是当下拉列表触发回发时,RowCommand似乎没有触发。即使它确实触发,我也不确定如何获得我需要的值。我有更好的办法吗?

2 个答案:

答案 0 :(得分:1)

我注意到你的代码中有一件事你在页面加载时调用了GridView2.DataBind()....尝试将它放在Page Prerender中,因为当一个事件被触发时它会调用页面加载,你的gridview将在之前刷新事件被处理....

然而,它并不总是导致问题

答案 1 :(得分:0)

尝试将此代码放入页面加载

protected void Page_Load(object sender, EventArgs e)
{
    if(!isPostback)
    {
    GridView2.DataSource = new Person(id).GetDataSet();
    GridView2.DataBind();
    }
}

这将解决您的问题