2014-09-29 60 views
0

我有一个gridview元素来列出成员对我的调查问卷的答案。所有答案都以字符串的形式存储在一列中。每4位数字就是相应问题的答案。对于由4个问题组成的问卷,答案可能是00010006000300040001如果DataBound列Visibilty为False我无法读取单元格值

<asp:GridView ID="gv" 
       runat="server" 
       AutoGenerateColumns="False" 
       DataKeyNames="id, memberid, qid, qdate, member, membermail, qtitle, answer" 
       OnSelectedIndexChanging="gv_SelectedIndexChanged" > 
    <Columns> 
     <asp:BoundField DataField="id" /> 
     <asp:BoundField DataField="memberid" HeaderText="Member ID" /> 
     <asp:BoundField DataField="qid" HeaderText="Questionnaire ID" /> 
     <asp:BoundField DataField="qdate" HeaderText="Date" /> 
     <asp:BoundField DataField="member" HeaderText="Member Name" /> 
     <asp:BoundField DataField="membermail" HeaderText="Member E-mail" /> 
     <asp:BoundField DataField="qtitle" HeaderText="Questionnaire" /> 
     <asp:BoundField DataField="answer" /> 
     <asp:CommandField SelectText="Analyze" ShowSelectButton="True" ButtonType="Link" HeaderText="Analysis" /> 
      </Columns> 
    </asp:GridView> 

protected void gv_SelectedIndexChanged(object sender, GridViewSelectEventArgs e) 
{ 
    string id   = gv.Rows[e.NewSelectedIndex].Cells[0].Text; 
    string memberid = gv.Rows[e.NewSelectedIndex].Cells[1].Text; 
    string qid  = gv.Rows[e.NewSelectedIndex].Cells[2].Text; 
    string qdate  = gv.Rows[e.NewSelectedIndex].Cells[3].Text; 
    string memberName = gv.Rows[e.NewSelectedIndex].Cells[4].Text; 
    string memberMail = gv.Rows[e.NewSelectedIndex].Cells[5].Text; 
    string qtitle  = gv.Rows[e.NewSelectedIndex].Cells[6].Text; 
    string answer  = gv.Rows[e.NewSelectedIndex].Cells[7].Text; 

    //... 
} 

如果我把所选行的答案单元格的值时

<asp:BoundField DataField="answer" Visible="false" /> 

我不能得到答案,

answer.Length //returns 0; 

在另一方面,如果Visible="true"一切都很好。但我不想在gridview中列出答案。

回答

2

您可以使用模板字段改为如下

<asp:TemplateField> 
    <ItemTemplate> 
     <asp:HiddenField runat="server" ID="hiddenFieldAnswer" Value='<%# Bind("answer") %>' /> 
    </ItemTemplate> 
</asp:TemplateField> 

然后你可以使用下面的代码访问的隐藏字段,在将selectedIndex更改事件

HiddenField hiddenFieldAnswer = gv.Rows[e.NewSelectedIndex].FindControl("hiddenFieldAnswer") as HiddenField; 
if (hiddenFieldAnswer != null) 
{ 
    string answer = hiddenFieldAnswer.Value; 
} 
+1

无法使用DataKeys或DataKeyNames解决它吗?我在想DataKeyNames属性是针对这种问题的。 – zkanoca 2014-09-29 14:37:24

+0

您仍然可以使用DataKeyNames来获取值(请参阅我的答案)。我同意@Kiran Hegde的回答,它会起作用。 – 2014-09-29 18:11:43

2

既然你已经拥有的价值answer作为DataKeyNames的一部分,这里是当您在DataKeyNames中存储多个值时如何获得相应的值。

protected void gv_SelectedIndexChanged(object sender, GridViewSelectEventArgs e) 
{ 
    .... 
    string answer= gv.DataKeys[e.NewSelectedIndex].Values["answer"].ToString(); 
    ... 
}