【问题标题】:Accessing items in GridView访问 GridView 中的项目
【发布时间】:2011-04-08 14:31:03
【问题描述】:

我有一个 GridView,我正在通过 C# 通过 LINQ 对其进行更新。我想访问 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>

【问题讨论】:

  • 请说明网格是否通过 autogeneratecolumns、bound field 或 tremplate field 绑定。还有你是否在gridview中设置了DataKeyNames?

标签: c# .net asp.net linq gridview


【解决方案1】:

Produce_ID 之类的东西听起来像是一个关键字段,如果是,您可以这样做

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

否则

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

【讨论】:

  • 我试过这个。我收到这个错误:索引超出范围。必须是非负数且小于集合的大小。参数名称:索引
  • +1。 @Nice_Name:在 gridviews 标记中将 Product_ID 定义为 DataKeyNames
【解决方案2】:

GridViewUpdateEventArgs 具有属性,可让您访问特定行的 KeysOldValuesNewValues 集合。

可以这样访问它:

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 类之一为您完成工作。为了您的目的,您应该查看LinqDataSource

值得注意的是,虽然 DataSource 类非常有用且美观,但它们具有相当多的魔力,您几乎可以排除使用任何可测试模式的可能性。 (见WebFormsMVP

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

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

【讨论】:

  • 我有 2 个不同的数据库,我在其中更新我的值。在 LDS 中,您只能更新到 1-1 基础。这就是为什么我要对其进行硬编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
相关资源
最近更新 更多