0
  <dx:ASPxGridView ID="grid" ClientInstanceName="grid" runat="server" 
         KeyFieldName="ProjectID" Width="100%" 
        EnableRowsCache="False"  OnRowUpdating="grid_RowUpdating" AutoGenerateColumns="False" OnCellEditorInitialize="grid_CellEditorInitialize">
        <Settings ShowGroupPanel="True" />
        <SettingsEditing Mode="Inline" />
        <Columns>
            <dx:GridViewCommandColumn VisibleIndex="0">
                <EditButton Visible="true" />
            </dx:GridViewCommandColumn>
            <dx:GridViewDataTextColumn FieldName="ProjectID" ReadOnly="True" VisibleIndex="0"/>

            <dx:GridViewDataColumn FieldName="ProjectName" VisibleIndex="1" />
            <dx:GridViewDataColumn FieldName="ProjectInfo" VisibleIndex="2" />
            <dx:GridViewDataComboBoxColumn   Caption="Project Manager"  FieldName="UserID" VisibleIndex="3">
               <PropertiesComboBox   TextField="DomainName" ValueField="UserID">
                </PropertiesComboBox>
            </dx:GridViewDataComboBoxColumn>         
        </Columns>
    </dx:ASPxGridView>

我有上面的 aspx 文件来显示来自联接表 User 和 Project 的数据。用户有字段 UserID 和 DomainName 并且项目有 ProjectManagerID(FK on USERID) ProjectInfo 和 ProjectName 这就是我填充数据的方式

protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        //Entity framework query Project.Include("User").ToList();
        grid.DataSource = BUS.Operations.EntityOperations.ProjectOperations.SelectAllProjects();
        grid.DataBind();
    }
}
//Upon edit comboboxes are populated
protected void grid_CellEditorInitialize(object sender, ASPxGridViewEditorEventArgs e)
{
    if (!grid.IsEditing || e.Column.FieldName != "User.DomainName") return;
    if (e.KeyValue == DBNull.Value || e.KeyValue == null) return;
    object val = grid.GetRowValuesByKeyValue(e.KeyValue, "ProjectID");
    if (val == DBNull.Value) return;
    int country = (int)val;
    ASPxComboBox combo = e.Editor as ASPxComboBox;
    FillCityCombo(combo);
    combo.Callback += new CallbackEventHandlerBase(cmbCity_OnCallback);
}
    protected void FillCityCombo(ASPxComboBox cmb)
    {
        cmb.DataSource= BUS.Operations.EntityOperations.UserOperations.SelectAllProjectManagers();     
        cmb.DataBindItems();
    }

这些是回调和行更新函数

void cmbCity_OnCallback(object source, CallbackEventArgsBase e)
{
    FillCityCombo(source as ASPxComboBox);
}
protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e)
{

    ASPxGridView gridView = (ASPxGridView)sender;
    int ProjectID = (int)e.Keys[gridView.KeyFieldName];
    P p = new P();
    p.ProjectName = e.NewValues["ProjectName"].ToString();
    p.ProjectInfo = e.NewValues["ProjectInfo"].ToString();
    p.ProjectID = ProjectID; 
    //User.DomainName should be inputted as int convertable string  
    p.ProjectManagerID = Int32.Parse(((string)e.NewValues["User.DomainName"]));
    BUS.Operations.EntityOperations.ProjectOperations.UpdateProject(p);
    gridView.CancelEdit();
    e.Cancel = true;
}

现在有两个主要问题。

  1. 第一个也是次要的一个是在从组合框中选择另一个项目经理并单击更新后,尽管数据库已更改并且页面刷新后可以看到效果,但我没有看到 Web 视图中的更改。

  2. 第二个也是主要的是,如果我不触摸组合框并更改项目名称等其他字段并单击更新,我会在无法转换为 int 的 rowupdate 方法上得到一个字符串。但是,如果我从组合框中选择并更新一个 int UserID,就会如我所料。

这是我在 devexpress 上的第一次试验,可能这段代码有很多错误和不必要的复杂性。我需要你的帮助以获得更好的工作代码

4

0 回答 0