C# 在GridView中访问项目

C# 在GridView中访问项目,c#,.net,asp.net,linq,gridview,C#,.net,Asp.net,Linq,Gridview,我有一个GridView,我正在通过LINQ和C更新它。我想访问GridView中的元素并将它们存储在变量中。然后我将把这些变量传递到我的LINQ查询中 我应该如何访问GridView中的项目?这是我的密码: protected void gvShowComm_RowUpdating(object sender, GridViewUpdateEventArgs e) { string productID = gvShowComm.DataKeys[e.RowIndex]["Product

我有一个GridView,我正在通过LINQ和C更新它。我想访问GridView中的元素并将它们存储在变量中。然后我将把这些变量传递到我的LINQ查询中

我应该如何访问GridView中的项目?这是我的密码:

protected void gvShowComm_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    string productID = gvShowComm.DataKeys[e.RowIndex]["Product_ID"].ToString(); //Working!
    string planName = gvShowComm.DataKeys[e.RowIndex]["PlanName"].ToString(); //Working!
    string hiComm = gvShowComm.DataKeys[e.RowIndex]["HiCommissionOld"].ToString(); //Working!
    string lowComm = gvShowComm.DataKeys[e.RowIndex]["LowCommissionOld"].ToString(); //Working!

    gvShowComm.DataBind();
}
标记:

<asp:GridView runat="server" Height="233px" Width="602px" ID ="gvShowComm" 
    CellPadding="4" ForeColor="#333333" GridLines="None" OnRowEditing = "gvShowComm_RowEditing" 
    OnRowUpdating = "gvShowComm_RowUpdating" 
    OnRowCancelingEdit = "gvShowComm_RowCancelingEdit" DataKeyNames = "Product_ID, PlanName, HiCommissionOld, LowCommissionOld">       
    <Columns>
        <asp:CommandField ShowCancelButton="True" ShowEditButton="True" />
    </Columns>
</asp:GridView>

像product\u ID这样的东西听起来像是一个键字段,如果是,您可以这样做

var keyValue =  gvShowComm.DataKeys[e.RowIndex].Value;
if(keyValue!=null)
int Product_ID = Convert.ToInt32(keyValue);
否则


您可以使用
e.NewValues[]
e.OldValues[]

类似product\u ID的内容听起来像是一个键字段,如果是,您可以这样做

var keyValue =  gvShowComm.DataKeys[e.RowIndex].Value;
if(keyValue!=null)
int Product_ID = Convert.ToInt32(keyValue);
否则

您可以使用
e.NewValues[]
e.OldValues[]

上的属性允许您获取,以及特定行的集合

您可以这样访问它:

protected void gvShowComm_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    //Product_ID is a column that I am displaying in my GV!
    int Product_ID = Int32.Parse(e.Keys["Product_ID"]);

    Entity_Product_Point ev = new Entity_Product_Point();

    ev.MyDateTime = DateTime.Parse(e.NewValues["MyProp"]);

    // And so on...
}
但这太糟糕了!ASP.Net可以使用其中一个可用的数据源类为您完成这项工作。出于您的目的,您应该查看

值得注意的是,虽然DataSource类很有用,也很不错,但它们有相当大的魔力,您几乎可以排除使用任何可测试模式的可能性。(见附件)

如果这不是个问题,那就去做吧。但从长远来看,实现清晰的关注点分离更好。在这种情况下,您需要围绕业务逻辑实现一个facade包装器,并使用

无论采用哪种方法,都比手动在键/值对集合中查找值,然后将其转换回正确的类型要好。

上的属性允许您获取特定行的、和集合

您可以这样访问它:

protected void gvShowComm_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    //Product_ID is a column that I am displaying in my GV!
    int Product_ID = Int32.Parse(e.Keys["Product_ID"]);

    Entity_Product_Point ev = new Entity_Product_Point();

    ev.MyDateTime = DateTime.Parse(e.NewValues["MyProp"]);

    // And so on...
}
但这太糟糕了!ASP.Net可以使用其中一个可用的数据源类为您完成这项工作。出于您的目的,您应该查看

值得注意的是,虽然DataSource类很有用,也很不错,但它们有相当大的魔力,您几乎可以排除使用任何可测试模式的可能性。(见附件)

如果这不是个问题,那就去做吧。但从长远来看,实现清晰的关注点分离更好。在这种情况下,您需要围绕业务逻辑实现一个facade包装器,并使用


无论采用哪种方法,都比手动在键/值对集合中查找值,然后将其转换回正确的类型要好。

请说明网格是通过autogeneratecolumns、bound field还是tremplate field绑定的。以及是否在gridview中设置了DataKeyName?请说明网格是通过autogeneratecolumns、bound字段还是tremplate字段绑定的。以及是否在gridview中设置了DataKeyName?我有两个不同的DB,在其中更新我的值。在LDS中,您只能按1-1进行更新。这就是为什么我想硬编码它。我有两个不同的数据库,我在其中更新我的值。在LDS中,您只能按1-1进行更新。这就是我想硬编码的原因。我试过这个。我得到这个错误:索引超出范围。必须为非负数且小于集合的大小。参数名称:索引+1@Nice_Name:在gridviews markupI中,将Product_ID定义为DataKeyName。我得到这个错误:索引超出范围。必须为非负数且小于集合的大小。参数名称:索引+1@Nice_Name:在GridView标记中将Product_ID定义为DataKeyName