2012-06-11 37 views
3

在以下示例中,我无法获取tel输入“Contract”的值。我没有任何与DropDownList有关的问题。在GridView的TemplateField中获取Html输入的值

ASPX代码:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
       DataKeyNames="Serial,Model" DataSourceID="ObjectDataSource1" Width="50%" GridLines="None" CellSpacing="-1"> 
        <Columns> 
         <asp:BoundField DataField="Serial" HeaderText="Serial" /> 
         <asp:BoundField DataField="Model" HeaderText="Model"/> 
         <asp:TemplateField HeaderText="Status"> 
         <ItemTemplate> 
          <asp:DropDownList ID="Status" CssClass="dropdownlist" runat="server" onfocus="setSelectedRow(this)" DataValueField="Status" SelectedValue='<%# Bind("Status") %>' onChange="statusChange(this)"> 
           <asp:ListItem Value="RENT READY">Rent Ready</asp:ListItem> 
           <asp:ListItem Value="ON RENT">On Rent</asp:ListItem> 
           <asp:ListItem Value="OOS">Out of Service</asp:ListItem> 
          </asp:DropDownList>        
          <input type="tel" id="Contract" onfocus="setSelectedRow(this)" value= '<%# Eval("Contract") %>' placeholder="Contract #" class='<%# (string)Eval("Status") == "ON RENT" ? "textBox" : "textBoxHidden" %>'></input> 
         </ItemTemplate> 
        </asp:TemplateField> 
</asp:GridView> 

渲染HTML:

enter image description here

我试过到目前为止:

protected void submit_Click(object sender, EventArgs e) 
{ 
    if (!Page.IsValid) return; 
    foreach(GridViewRow row in GridView1.Rows) 
    { 
     string Serial = row.Cells[0].Text; 
     string Model = row.Cells[1].Text; 
     string Status = ((DropDownList)row.FindControl("Status")).SelectedValue; 
     string Contract = Any one of the below attempts... 

     Sql stored procedure integrating the data back to the server... 
    } 
} 

string Contract = ((HtmlInputControl)row.FindControl("Contract")).Value; 

string Contract = ((HtmlInputText)row.FindControl("Contract")).Value; 

string Contract = ((TextBox)row.FindControl("Contract")).Text; 

都会抛出对象引用未设置到实例对象异常。

+0

你想抓取页面加载,rowdatabound,行更新等的价值? – peroija

+0

按钮单击。我正在做一个foreach(GridView1.Rows中的GridViewRow行) – jmease

+0

然后你可以发布这个事件的代码的其余部分? – peroija

回答

2

更改您的输入是这样的:在aspx文件中添加runat="server"属性

使用type = "text"

<input type="text" runat="server" id="Contract" onfocus="setSelectedRow(this)" value= '<%# 
    Eval("Contract") %>' placeholder="Contract #" class='<%# (string)Eval("Status") == "ON 
    RENT" ? "textBox" : "textBoxHidden" %>' ></input> 

然后在后面的代码将其更改为type = "tel"时GridRows在OnRowCreated事件像这样被创造

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
      ((HtmlInputText)(e.Row.FindControl("Contract"))) 
       .Attributes.Add("type", "tel"); 
    } 

检索输入值使用此

string Contract = ((HtmlInputText)row.FindControl("Contract")).Value; 
+0

谢谢,但我特别使用“tel”输入来调出移动设备上的数字键盘。由于该网站专门用于平板电脑,因此非常重要。 – jmease

+0

它是用'tel'类型编译的吗? –

+0

是的。我在OP中包含了呈现的HTML,尽管它稍微小了点。 – jmease

0
  1. 您需要添加runat="server"在 服务器端
  2. value属性没有=迹象,是在渲染HTML空的访问HTML输入控制
  3. 没有结束标签/在呈现html中

呈现的输入标记:

<input type="tel" id="Contract" onfocus="setSelectedRow(this)" value placeholder="Contract #" class="textBoxHidden"> 

你需要的东西是这样的:

<input type="text" id="Contract" runat="server" onfocus="setSelectedRow(this)" value='<%# (string)Eval("Contract") == "" ? "" : Eval("Contract") %>' placeholder="Contract #" class='<%# (string)Eval("Status") == "ON RENT" ? "textBox" : "textBoxHidden" %>' /> 

如果value属性还惦记=登录呈现的HTML然后再尝试它的值设置为一些虚拟的电话。

value='<%# (string)Eval("Contract") == "" ? "0" : Eval("Contract") %>' 
相关问题