LinqServerModeDataSource中的自定义列

时间:2010-08-27 07:49:28

标签: linq linq-to-sql devexpress

我的数据库名称中包含用户字段:

Id
FirstName
LastName
LoginName

现在,我想使用ASPxGridViewLinqServerModeDataSource中提供此表格。

我做的是:

<dxdtlnq:LinqServerModeDataSource ID="LinqServerModeDataSource1" runat="server"          OnSelecting="LinqServerModeDataSource1_OnSelecting"
  ContextTypeName="MyContext" EnableDelete="True" 
  EnableInsert="True" EnableUpdate="True" TableName="Users" >
</dxdtlnq:LinqServerModeDataSource>

protected void LinqServerModeDataSource1_OnSelecting(object sender, LinqServerModeDataSourceSelectEventArgs e) 
{           
   MyContext context = new MyContext();

   var qry = from s in context.Users select s;
   e.QueryableSource = qry;
}

这对我的ASPxGridView非常有用。我可以显示数据,插入和删除,但现在我想添加UserName + FirstName的其他列LastName

所以我做了类似的事情:

为我的ASPxGridView添加了适当的列(FieldName =“UserName”) 并修改了OnSelecting处理程序:

protected void LinqServerModeDataSource1_OnSelecting(object sender, LinqServerModeDataSourceSelectEventArgs e) {
            KozuModelDataContext context = new MyContext();

        var qry = (from s in context.Substitutions
                   select new
                              {
                                  Id = s.Id,
                                  FirstName = s.FirstName,
                                  LastName = s.LastName,
                                  LoginName = s.LoginName,
                                  UserName = s.FirstName + " " + s.LastName,
                              }).AsQueryable();

        e.KeyExpression = "Id";
        e.QueryableSource = qry;
    }

现在,当我想插入或编辑数据字段时,网格中的数据显示为buyt,文本框在插入表单时没有响应,我无法在任何文本中输入。

是否有以这种方式插入和编辑数据的解决方案?

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

我尝试重现此问题并看到此行为。为了能够使用这种方法编辑数据,我建议您执行以下操作:

1)处理ASPxGridView.CellEditorIntitialize事件并将e.Editor.ReadOnly属性设置为false。这将允许最终用户修改EditForm编辑器中的数据;

2)处理ASPxGridView.RowUpdating(RowInserting)事件并手动更新数据。此外,您应该将e.Cancel参数设置为true(以防止网格自身更新数据),并调用GridView的CancelEdit方法来关闭EditForm。

我还应该提一下,不需要从DB获取UserName的数据。这可以使用ASPxGridView的CustomColumnDisplayText事件处理程序完成:

protected void ASPxGridView1_CustomColumnDisplayText(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewColumnDisplayTextEventArgs e) {
    if(e.Column.FieldName == "") {
        object[] values = ASPxGridView1.GetRowValues(e.VisibleRowIndex, new string[] { "FirstName", "LastName" }) as object[];
        e.DisplayText = values[0].ToString() + " " + values[1].ToString();
    }
}

如果此方法适用于您,则可以避免使用Selecting事件,从而设置LinqServerModeDataSource的TableName。这将允许您提供数据编辑功能,而不是使用我上面解释的方法。