FindControl在OnRowCommand Event中返回null

时间:2016-12-26 09:48:03

标签: c# asp.net gridview

我有一个gridview,其中包含很少的控件,我试图通过使用FindControl方法在OnRowCommand事件中获取这些控件,但它总是返回null。

这是gridview

<asp:GridView ID="GridView1" runat="server" CssClass="table table-striped table-bordered" AutoGenerateColumns="false" DataKeyNames="ID" OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowEditing="GridView1_RowEditing"
    OnRowDataBound="GridView1_RowDataBound" OnRowCommand="GridView1_RowCommand" OnRowUpdating="GridView1_RowUpdating">
    <Columns>
        <asp:TemplateField HeaderText="Service Type">
            <ItemTemplate>
                <asp:Label Text='<%# Eval("Fund_Service_Type") %>' runat="server" />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList ID="ddlServiceType" runat="server">
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="Method">
            <ItemTemplate>
                <asp:Label Text='<%# Eval("Fund_Method") %>' runat="server" />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList ID="ddlFundMethod" runat="server">
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="Source">
            <ItemTemplate>
                <asp:Label Text='<%# Eval("Fund_Source") %>' runat="server" />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:DropDownList ID="ddlFundSource" runat="server">
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="Amount">
            <ItemTemplate>
                <asp:Label Text='<%# Eval("Fund_Amount") %>' runat="server" />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox ID="txtAmount" runat="server" Text='<%# Eval("Fund_Amount")%>'></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField Visible="true" HeaderText="" ShowHeader="false">
            <ItemTemplate>
                <asp:LinkButton ID="btnRedirect" runat="server" CommandArgument='<%# Bind("ID") %>' CommandName="CompleteTransaction" Text="Complete Transaction"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

这是行命令事件

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {

        if (e.CommandName.Equals("CompleteTransaction"))
        {                
            GridViewRow gvr = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer);
            int rowIndex = Convert.ToInt32(e.CommandArgument); // Get the current row
            DropDownList ddlServiceType = (DropDownList)GridView1.Rows[rowIndex].Cells[0].FindControl("ddlServiceType");//retuns null

            GridViewRow selectedRow = GridView1.Rows[rowIndex];
            DropDownList name = (DropDownList)gvr.Cells[0].FindControl("ddlServiceType"); //also returns null
            Server.Transfer("~/Transaction.aspx");
        }
    }

我尝试做的是获取所选行以及来自其控件的值,以便我可以在“事务”页面中使用它们。

编辑: FindControl方法在RowUpdating和RowDataBound事件中正常工作

2 个答案:

答案 0 :(得分:2)

由于您的DropDownLists位于EditItemTemplate,因此您需要使用EditIndex来获取正确的行。

DropDownList ddlServiceType = (DropDownList)GridView1.Rows[GridView1.EditIndex].FindControl("ddlServiceType");
ddlServiceType.BackColor = Color.Red;

答案 1 :(得分:2)

这可能会帮助你

list_of_passwords = ['Password is', 'Pwd:', 'password:']
my_string = 'This is my string that contains Pwd: 89237'
collected_password = my_string.split(list_of_passwords)[1]

print collected_password