【问题标题】:Why do I get empty strings when reading GridViewRow text values?为什么读取 GridViewRow 文本值时会得到空字符串?
【发布时间】:2013-07-01 09:16:42
【问题描述】:

好吧,既然没有人能够确定为什么my DataTable could not get the updated GridView data,我现在正尝试直接从 GridView 获取值。

现在的问题是我读取 GridViewRows 得到的文本值都是空字符串。

这是我的代码:

ASPX Markup code for the GridView:

<asp:gridview ID="ESBAndTSRValuesInputGridView" runat="server" ShowFooter="true" AutoGenerateColumns="false">
    <Columns>
    <asp:BoundField DataField="AwardID" HeaderText="Award ID" Visible="false" />
    <asp:BoundField DataField="AwardName" HeaderText="Award Name" />
    <asp:TemplateField HeaderText="ESBValue">
        <ItemTemplate>
            <asp:TextBox ID="ESBValue" Text='<%# Eval("ESBValue") %>' runat="server"></asp:TextBox>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="TSRValue">
        <ItemTemplate>
            <asp:TextBox ID="TSRValue" Text='<%# Eval("TSRValue") %>'  runat="server"></asp:TextBox>
        </ItemTemplate>
    </asp:TemplateField>
    </Columns>
</asp:gridview>

从按钮单击的代码隐藏中初始化 GridView 数据:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("AwardID", typeof(string)));
dt.Columns.Add(new DataColumn("AwardName", typeof(string)));
dt.Columns.Add(new DataColumn("ESBValue", typeof(string)));
dt.Columns.Add(new DataColumn("TSRValue", typeof(string)));
DataRow[] PSPAwards = dtAwards.Select("AWARDTYPE = 'PSP'");
foreach (DataRow dr in PSPAwards)
{
    dt.Rows.Add(dr["AWARDID"].ToString(), dr["AWARDNAME"].ToString(), "0", "100");
}
ViewState["ESBAndTSRValuesDataTable"] = dt;
ESBAndTSRValuesInputGridView.DataSource = dt;
ESBAndTSRValuesInputGridView.DataBind();

尝试读取 GridViewRow 值:

for (int rowCount = 0; rowCount < ESBAndTSRValuesInputGridView.Rows.Count; rowCount++)
{

    int cell0Val, cell1Val, cell2Val, cell3Val;

    //input text is blank for all:
    //TryParse returns false for all (because if I use Parse instead, exception occurs):

    Int32.TryParse(ESBAndTSRValuesInputGridView.Rows[rowCount].Cells[0].Text, out cell0Val);
    Int32.TryParse(ESBAndTSRValuesInputGridView.Rows[rowCount].Cells[1].Text, out cell1Val);
    Int32.TryParse(ESBAndTSRValuesInputGridView.Rows[rowCount].Cells[2].Text, out cell2Val);
    Int32.TryParse(ESBAndTSRValuesInputGridView.Rows[rowCount].Cells[3].Text, out cell3Val);

    int val1 = Int32.Parse(ESBAndTSRValuesInputGridView.Rows[rowCount].Cells[0].Text);
    int val2 = Int32.Parse(dr["AWARDID"].ToString());

    if (val1 == val2)
    {
        rowIndex = rowCount;
        break;
    }
}

那么在读取 GridViewRows 时如何获取实际的文本值?

我需要 BoundFields 和 TextFields 的值 ..

我正在使用带有 .NET 2.0 Framework 的 Visual Studio 2005 ..

【问题讨论】:

    标签: asp.net .net gridview datatable .net-2.0


    【解决方案1】:

    用这个替换你的最后一个鳕鱼块

    您不能直接从文本框获取值..您必须通过 id 找到该控件

    网格视图

    <asp:GridView ID="ESBAndTSRValuesInputGridView" runat="server" ShowFooter="true"
        AutoGenerateColumns="false">
        <Columns>
            <asp:TemplateField HeaderText="Award Name">
                <ItemTemplate>
                    <asp:Label ID="lblAwardID"  runat="server" Text='<%# Eval("AwardID") %>' Style="display: none;"></asp:Label>
                    <asp:Label ID="lblAwardName"  runat="server" Text='<%# Eval("AwardName") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="ESBValue">
                <ItemTemplate>
                    <asp:TextBox ID="ESBValue" Text='<%# Eval("ESBValue") %>' runat="server"></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="TSRValue">
                <ItemTemplate>
                    <asp:TextBox ID="TSRValue" Text='<%# Eval("TSRValue") %>' runat="server"></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    

    获取值

     for (int rowCount = 0; rowCount < ESBAndTSRValuesInputGridView.Rows.Count; rowCount++)
            {
    
                int cell0Val, cell1Val, cell2Val, cell3Val;
    
                //input text is blank for all:
                //TryParse returns false for all (because if I use Parse instead, exception occurs):
    
                Int32.TryParse(((Label)ESBAndTSRValuesInputGridView.Rows[rowCount].FindControl("lblAwardID")).Text, out cell0Val);
                Int32.TryParse(((Label)ESBAndTSRValuesInputGridView.Rows[rowCount].FindControl("lblAwardName")).Text, out cell1Val);
                Int32.TryParse(((TextBox)ESBAndTSRValuesInputGridView.Rows[rowCount].FindControl("ESBValue")).Text, out cell2Val);
                Int32.TryParse(((TextBox)ESBAndTSRValuesInputGridView.Rows[rowCount].FindControl("TSRValue")).Text, out cell3Val);
                Int32.TryParse(ESBAndTSRValuesInputGridView.Rows[rowCount].Cells[3].Text, out cell3Val);
    
                int val1 = Int32.Parse(ESBAndTSRValuesInputGridView.Rows[rowCount].Cells[0].Text);
                int val2 = Int32.Parse(dr["AWARDID"].ToString());
    
                if (val1 == val2)
                {
                    rowIndex = rowCount;
                    break;
                }
            }
    

    【讨论】:

    • 单元格 0 和 1 用于没有 ID 的 BoundFields。那么它如何为那些人工作呢?
    • 您必须找到控件才能从作为网格视图子级的 asp 控件获取值..您无法直接获取值..前两个不是控件,它们是绑定字段
    • 那么我如何获得 BoundFields 的值,因为这才是我真正想要的?
    • 您忘记提及您创建的两个标签的runat="server" 声明......但除此之外,它工作正常! :) .. 我建议你也为这两个标签添加runat="server",以防万一其他人提出这个答案,但它对他们不起作用,就像你目前写的那样..
    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多