C# 更改下拉列表时从GridView更新

C# 更改下拉列表时从GridView更新,c#,asp.net,gridview,C#,Asp.net,Gridview,我有一个GridView控件,我想有两个可见字段,一个标签和一个下拉列表。我希望将ItemTemplate定义为下拉值,而不是使用RowEditTemplate 在下拉列表发生更改的事件中,我希望执行一些代码,从中可以获取gridview行的整数键以及下拉列表的新选定值。如下所示: <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" DataKeyNames="pk_id" onr

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

在下拉列表发生更改的事件中,我希望执行一些代码,从中可以获取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>

下拉列表已填充并正确选择了值,但我无法通过下拉列表使删除或更新正常工作。我已经尝试过实现这些功能,但是当下拉菜单触发回发时,row命令似乎没有启动。即使它真的触发了,我也不确定如何获得所需的值。有更好的方法吗?

我注意到您的代码中有一件事,您在页面加载时调用了GridView2.DataBind()。请尝试将其放在页面预渲染中,因为当触发事件时,它会调用页面加载,并且您的gridview将在处理事件之前刷新


但是,它并不总是会导致问题

我注意到,在您的代码中有一件事,您在页面加载时调用了GridView2.DataBind()。请尝试将其放入页面预渲染中,因为当触发事件时,它会调用页面加载,并且您的gridview将在处理事件之前刷新


但是,它并不总是会导致问题

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

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

这将解决您的问题

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

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

这将解决您的问题。是否为页面启用了ViewState?很棘手。是否为页面启用了ViewState?非常好的一点,当我尝试使用其他解决方案时,这确实带来了问题。我采纳了你的建议,效果很好。谢谢非常好的一点,当我尝试使用另一种解决方案时,这确实带来了一个问题。我采纳了你的建议,效果很好。谢谢