2011-07-05 80 views
0

我认为这对我来说很容易找出(或atl东在网上找到有人),但我遇到了问题。在gridview中访问单元格值

我有下面的代码创建我的GridView:在C#侧

<asp:GridView runat="server" ID="ContactsGrid" AutoGenerateColumns="False" DataSourceID="LinqContact" 
      CellPadding="4" ForeColor="#333333" GridLines="None" OnRowDeleting="ContactsGridView_RowDeleting" > 
    <AlternatingRowStyle BackColor="White" /> 
    <Columns> 
     <asp:BoundField DataField="IConact_ID" Visible="false" ReadOnly="true" /> 
     <asp:BoundField DataField="cFirstName" HeaderText="First Name" ReadOnly="True" /> 
     <asp:CommandField HeaderText="Delete" ShowDeleteButton="True" /> 
    </Columns> 
</asp:GridView> 

<asp:LinqDataSource ID="LinqContact" runat="server" ContextTypeName="TIPS.App_Data.TIPSDataContext" onselecting="LinqContact_Selecting" > 
</asp:LinqDataSource> 

现在,我希望能够拉从第一列中的值(它是隐藏的),并用它来删除(具有onroedeleting事件)的特定记录,但是我发现所有的方法都会导致null,如果我没有LinqDatasource会发生什么情况。

我已经试过(和其他摆真正似乎没有是正确的,那么未上市):

ContactsGrid.SelectedRow.Cells[0].Text; 
ContactsGrid.Columns[0]; 

感谢您的帮助!

编辑:

好了,我发现,当你隐藏它使用网格你不能得到这个隐藏在列的值。我确实找到了解决办法。如果您使用css来隐藏列,您仍然可以访问该列。

<style type="text/css"> 
.hiddencol 
{ 
    display:none; 
} 

</style> 

<asp:BoundField DataField="IContact_ID" ReadOnly="true" itemstyle-cssclass="hiddencol" /> 

我不认为这是首选的.net方式。我找到了一个名为datakeynames的参考,这似乎是正确的方法。接下来我将深入研究这些问题。

编辑#2:

我看到马拉什和我都想出了隐藏领域的解决方案,但我想我找到了最好的一个(导致其简单,内置)。

在gridview标签中,您可以将datakeynames属性设置为您的列(就像我在隐藏列中存储的主键),您也可以存储多列。

<asp:GridView runat="server" ID="ContactsGrid" AutoGenerateColumns="False" DataSourceID="LinqContact" DataKeyNames="IContact_ID" 
CellPadding="4" ForeColor="#333333" GridLines="None" OnRowDeleting="ContactsGridView_RowDeleting" > 

然后你可以参考它:

ContactsGrid.DataKeys[e.RowIndex].Value; 

回答

1

试试这个:

void ContactsGrid_RowDeleting(Object sender, GridViewDeleteEventArgs e) 
{ 
    ContactsGrid.Rows[e.RowIndex].Cells[0]; 
} 

在这里看到更多的细节http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdeleting.aspx#Y200

。笔者的意见后

编辑:

如果你把它的知名度为“假”,那么还有什么你的浏览器可以送你回去的回传。您可以在第二个例子中使用隐藏域,如:

<asp:GridView runat="server" ID="gv" OnRowDeleting="gv_RowDeleting" AutoGenerateColumns="false" AutoGenerateDeleteButton="true"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:HiddenField ID="hf" runat="server" Value="<%# ((YourItemType)Container.DataItem).Id %>" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 


protected void gv_RowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    HiddenField hf = (HiddenField) gv.Rows[e.RowIndex].Cells[0].FindControl("hf"); 
} 
+0

嗯......这很有趣。你的方式工作,但只有当列可见。如果它标记为不可见,则该值返回为空白。其实它甚至没有给我和隐藏的列上的错误,我的数据字段值列甚至不存在!只有我发现可见的人。 – Limey

+0

检查第二个解决方案 –

+0

感谢您的帮助!你帮助我走上了正确的道路! – Limey