簡體   English   中英

Gridview row.Cells [i] .Findcontrol在錯誤的Cell中查找控件

[英]Gridview row.Cells[i].Findcontrol finding control in wrong Cell

我已經編寫了一個函數,可以在gridview行中傳遞該函數,以及您要查找的控件類型。 它找到預期的控件,但是,它在錯誤的單元格中找到它。

protected int GetCell(GridViewRow row, string strSection)
{
    int intVal = 0;
    for (int i = 0; i < row.Cells.Count; i++)
    {
        intVal = i;
        if (strSection == "QueryRate")
        {
            DropDownList cmbQueryType = row.Cells[i].FindControl("cmbQueryType") as DropDownList;
            if (cmbQueryType != null)
            {
                break;
            }
        }
        else if (strSection == "Name")
        {
            TextBox txtName = row.Cells[i].FindControl("txtName") as TextBox;
            if (txtName != null)
            {
                break;
            }
        }
    }
    return intVal;
}

據我了解,並且直接從Microsoft頁面:從當前的命名容器中搜索具有指定id參數的服務器控件。

所以我的問題是,為什么這似乎發現控件是錯誤的列? 我無法對特定的列進行硬編碼,因為顯示的列會根據數據源而有所不同。

根據請求,gridview:

<TDWeb:PageGridView SkinID="pagegrid" EmptyDataText="No unmatched parameters."  ID="gvUnmatched"  runat="server"  AllowSorting="True" 
                            OnSorting="gvUnmatched_Sorting" AutoGenerateColumns="False"  OnRowDataBound="gvUnmatched_RowDatabound"  OnDataBound="gvUnmatched_DataBound"
                            OnPreRender="gvUnmatched_PreRender" OnPageIndexChanging="OnFilterUnmatched" DataKeyNames="InternalName"
                            ShowFooter="true" OnPageSizeChanged="gvUnmatched_PageSizeChanged">
                    <Columns>
                        <asp:TemplateField runat="server" ItemStyle-CssClass="c" FooterStyle-CssClass="c">
                            <HeaderTemplate>
                                <asp:Label runat="server" Text="Add" />
                                <asp:CheckBox runat="server" ID="ckbAddAll" />
                            </HeaderTemplate>
                            <ItemTemplate>
                                <asp:CheckBox runat="server" ID="ckbAdd" EnableViewState="true" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField runat="server" ItemStyle-CssClass="c">
                            <HeaderTemplate>
                                <asp:Label runat="server" Text="Ignore" />
                                <asp:CheckBox runat="server" ID="ckbIgnoreAll" />
                           </HeaderTemplate>
                           <ItemTemplate>
                               <asp:CheckBox runat="server" ID="ckbIgnore" />
                           </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField runat="server" HeaderText="Name" SortExpression="Name" ItemStyle-CssClass="l">
                            <HeaderTemplate>
                                <asp:LinkButton runat="server" Text="Name" CommandName="Sort" CommandArgument="Name" />
                                <td:HelperBox ID="HelperBox5" runat="server" ToolTipText="Set the Name for this parameter. This value must be unique to the CAN Bus or ECU and is the value used throughout the DAP system to reference this parameter." />
                            </HeaderTemplate>
                            <ItemTemplate>
                                <asp:TextBox runat="server" ID="txtName" Width="250" MaxLength="256" style="background-color:inherit" Text='<%# Bind("Name") %>' /> 
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField runat="server" ItemStyle-CssClass="l" SortExpression="Description">
                            <HeaderTemplate>
                                <asp:LinkButton runat="server" Text="Description" CommandName="Sort" CommandArgument="Description" />
                                <td:HelperBox ID="HelperBox4" runat="server" ToolTipText="Set the Description for this parameter. This value is for informational purposes only. Not required." />
                            </HeaderTemplate>
                            <ItemTemplate>
                                <asp:TextBox runat="server" ID="txtDescription" Width="175" MaxLength="500" 
                                    TextMode="multiline" style="background-color:inherit" Text='<%# Bind("Description") %>' /> 
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField runat="server" HeaderText="Length (bits)" SortExpression="LengthBits" ItemStyle-CssClass="r">
                            <ItemTemplate>
                                <asp:Label runat="server" ID="txtSizeBits" Text='<%# (int)Eval("LengthBits") + (int)Eval("LengthBytes") * 8 %>' style="background-color:inherit" /> 
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField runat="server" AccessibleHeaderText="SourceAddress" HeaderText="SA" SortExpression="Sources" ItemStyle-CssClass="r">
                            <ItemTemplate>
                                <asp:Label runat="server" ID="txtSources" Text='<%# Eval("SourceString") %>' /> 
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField runat="server" AccessibleHeaderText="ID" HeaderText="ID/Address" SortExpression="IDorAddress" ItemStyle-CssClass="r">
                            <ItemTemplate>
                                <asp:Label runat="server" ID="txtIDorAddress" Text='<%# Eval("IDorAddress") %>' /> 
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField runat="server" HeaderText="Data Type" SortExpression="Datatype" ItemStyle-CssClass="l">
                            <ItemTemplate>
                                <asp:Label runat="server" ID="txtDatatype" Text='<%# Bind("Datatype") %>' /> 
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField runat="server" AccessibleHeaderText="QueryRate" ItemStyle-CssClass="r" SortExpression="QueryRate" HeaderText="Query Rate">
                            <HeaderTemplate>
                                <asp:Label runat="server" Text="Rate" />
                                <td:HelperBox ID="HelperBox9" runat="server" ToolTipText="Set the Query Type and Rate for this parameter (if applicable). If set, this value overrides the default Query set below." />
                            </HeaderTemplate>
                            <ItemTemplate>
                                <asp:Label runat="server" ID="lblCANRate" Text='<%# Eval("QueryRateString", "{0} s") %>' Visible='<%# m_SelectedFile.ImportType == App_Code.DAPConfig.ParameterFileImport.EImportType.CANDBC || (m_SelectedFile.ImportType == App_Code.DAPConfig.ParameterFileImport.EImportType.J1939DBC && ((int)Eval("QueryRate")) > 0) %>' />
                                <asp:DropDownList runat="server" ID="cmbQueryType" style="background-color:inherit" Visible='<%# m_SelectedFile.ImportType != App_Code.DAPConfig.ParameterFileImport.EImportType.CANDBC && (m_SelectedFile.ImportType != App_Code.DAPConfig.ParameterFileImport.EImportType.J1939DBC || (int)Eval("QueryRate") <= 0) %>' />
                                <asp:Panel runat="server" id="pnlRate" style="display:none" ><asp:TextBox runat="server" ID="txtRate" Width="50" MaxLength="6" style="background-color:inherit" />s</asp:Panel>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:TemplateField runat="server" HeaderText="Category" ItemStyle-CssClass="l">
                            <HeaderTemplate>
                                <asp:Label runat="server" Text="Category" />
                                <td:HelperBox ID="HelperBox10" runat="server" ToolTipText="Set the Category with which to group this parameter, or create a new category." />
                            </HeaderTemplate>
                            <ItemTemplate>
                                <asp:DropDownList runat="server" ID="cmbCategory" style="background-color:inherit" >
                                    <asp:ListItem Value="_New_" Text="Add New..." />
                                </asp:DropDownList>
                                <br />
                                <asp:TextBox Width="100" MaxLength="50" runat="server" ID="txtCategory" style="display:none;background-color:inherit" />
                            </ItemTemplate>
                        </asp:TemplateField>
                   </Columns>
               </TDWeb:PageGridView>

好的-事實證明調用row.cells(0).FindControl("")等同於調用row.FindControl("")因為FindControl()在當前NamingContainer中運行。 給定行中的所有單元格都具有相同的NamingContainer ,特別是{System.Web.UI.WebControls.GridViewRow}

如果您只需要確定給定控件的列索引,請嘗試以下操作(對不起,VB):

Public Function getCellIndexByName(ByVal row As GridViewRow, ByVal ColumnName As String) As Integer
    For ci As Integer = 0 To row.Cells.Count - 1
        If CType(row.Cells(ci), DataControlFieldCell).ContainingField.ToString() = ColumnName Then
            Return ci
        End If
    Next

    Return -1
End Function

如果知道要查找的控件的ID,則無需指定單元格。 您可以查看整行來找到它。

DropDownList cmbQueryType = row.FindControl("cmbQueryType") as DropDownList 

這樣可以避免不正確的單元格索引的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM