5

DevExpressASPxGridViewを使用する必要があります。ObjectTypeとObjectIDの2つの重要な列を返すデータソースオブジェクトがあります。ObjectTypeは、PatientまたはPhysicianにすることができます。ObjectIDは、患者または医師のIDを与えるint値です。うまくいけば、これは理にかなっています。ObjectIDは、PatientテーブルまたはPhysicianテーブルのいずれかによって選択されます。これらは独立したテーブルであるため、どのような方法でも結合できません。

テーブル構造は次のようになります。

オブジェクトテーブル:ObjectType varchar("Physician"または"Patient")、ObjectID int

Dogs Table ID int、Name varchar

CatsテーブルIDint、名前varchar

コンボボックスで適切なobjectTypeを記述し、データソースによって入力される2つのコントロールcbPatientとcbPhysicianを使用してObjectIDを記述できました。

ASPxGridViewを編集するときに、オブジェクトの値をcbPatientまたはcbPhysicianに表示するにはどうすればよいかわかりません。たとえば、ObjectTypeがCatsで、ObjectIDが1の場合、ID1に対応する名前をcbCatsに表示します。

これがコードの外観です。現在、何らかの理由で、選択された値は、ある時点で、ある時点で空白になります。このコードを実行するイベントがわかりません。

protected void grid_HtmlRowCreated(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewTableRowEventArgs e)
{
    if (e.RowType != DevExpress.Web.ASPxGridView.GridViewRowType.EditForm) return;
    if (grid.IsNewRowEditing || grid.IsEditing)
    {
        int val = (int)grid.GetRowValues(grid.EditingRowVisibleIndex, "ObjectID" );

        ASPxComboBox cbPatient = ((ASPxComboBox)grid.FindEditRowCellTemplateControl(grid.Columns["PatientID"] as GridViewDataComboBoxColumn, "cbPatient"));
        if (val != 0)
        {
            string objectID = grid.GetRowValues(grid.EditingRowVisibleIndex, "ObjectID").ToString();

            if (cbPatient.Items.Count > 0)
            {
                cbPatient.Items[1].Selected = true;
            }
            else
            {
                cbPatient.DataSource = dsPatName;
                cbPatient.DataBindItems();
                if (cbPatient.Items.Count > 0)
                    cbPatient.Items[1].Selected = true;
            }

        }
    }

}

これはASPXコードです。

</dx:GridViewDataComboBoxColumn>
<dx:GridViewDataComboBoxColumn Caption="Patient Name" FieldName="PatientID"  Name="PatName"  Visible="false">
    <PropertiesComboBox TextField="Name" ValueField="ID" ValueType="System.Int32"></PropertiesComboBox>
    <EditItemTemplate>
        <dx:ASPxComboBox ID="cbPatient" runat="server"  TextField="Name" ValueField="ID"
        Value='<%# Bind("PatientID") %>' AutoPostBack="false" ValueType="System.Int32" > </dx:ASPxComboBox>
    </EditItemTemplate>
</dx:GridViewDataComboBoxColumn>
4

2 に答える 2

2

私はついに、コンボボックスがデータバインディングの後にDataBoundイベントを発生させることを理解しました。これは、RowEdittingイベント(またはそれが呼び出されるもの)の後に発生します。私が見つけた最良の解決策はこのコードでした。よりエレガントな解決策があるかもしれませんが、これは機能します。セッション変数は、行の更新を行うときにコードが起動しないようにするためにあります(ええ、それも起動します。理由を聞かないでください)。

protected void cbPatient_DataBound(object sender, EventArgs e)
{
    object rightsindex = grid.GetRowValues(grid.EditingRowVisibleIndex, "Rights");
    if (rightsindex == null) return;
    int rights = Int32.Parse(grid.GetRowValues(grid.EditingRowVisibleIndex, "Rights").ToString());
    object objectID = grid.GetRowValues(grid.EditingRowVisibleIndex, "ObjectID");

    ASPxComboBox cbPatient = ((ASPxComboBox)grid.FindEditRowCellTemplateControl(grid.Columns["PatientID"] as GridViewDataComboBoxColumn, "cbPatient"));
    if (cbPatient != null && cbPatient.Items.Count > 1)
    {

        if (rights == 8)
        {
            ListEditItem pt = cbPatient.Items.FindByValue(objectID);
            if (pt != null && Session["PatientID"] == null)
            {
                cbPatient.Items[pt.Index].Selected = true;
                Session["PatientID"] = (Int32)pt.Value;

            }
        }
            //cbPatient.Items[1].Selected = true;
    }
}

そしてASP.NETで

<dx:GridViewDataComboBoxColumn Caption="Patient Name" FieldName="PatientID"  Name="PatName"  Visible="false">
    <PropertiesComboBox DataSourceID="dsPatName" TextField="Name" ValueField="ID" ValueType="System.Int32">
    </PropertiesComboBox>
    <EditItemTemplate>
        <dx:ASPxComboBox ID="cbPatient" runat="server" DataSourceID="dsPatName" TextField="Name" ValueField="ID"
        Value='<%# Bind("PatientID") %>' AutoPostBack="false" ValueType="System.Int32" ondatabound="cbPatient_DataBound" > </dx:ASPxComboBox>
    </EditItemTemplate>
</dx:GridViewDataComboBoxColumn>
于 2012-05-26T21:43:26.973 に答える
0

まず、データがグリッドビューにバインドされたときに発生するGridView_RowDataBoundEventを使用して、コードをグリッドビューに配置する必要があります。次に、ComboBoxに値を設定できるようにするには、次の手順を実行する必要があります。

//Ensure that the Dropdownlist dosn't have any value selected, otherwise it will give  an exception
DropDownList_Country.ClearSelection();
//You can use either FindByValue or FindByText
DropDownList_Country.Items.FindByValue("").Selected = true;
于 2012-05-22T11:09:29.847 に答える