2014-09-29 59 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(); 
    ... 
}