0

ASPxGridViewコントロールのリストを表示するために使用しようとしていASPxComboBoxます。グリッドの行とコンボ ボックスのオプションのリストの両方が、コードから取り込まれます。コンボ ボックスの初期値の設定に問題があります。

下の画像のようなものを探しています。

ここに画像の説明を入力

スクリーンショットでわかるように、グリッド ビューとコンボ ボックスの両方を設定できましたが、コンボ ボックスの初期値を設定する方法がわかりません。

  • 内側のコンボ ボックスの Init イベントには、バインドされたオブジェクトを取得するための明確なプロパティはありません。
  • StackOverflow に関する他のいくつかの質問を見つけました。その答えは、バインドされたプロパティをコンボ ボックスに追加することでした。SelectedIndex='<%# Bind("Level") %>'ただし、の宣言に追加すると、 InnerCombo「Eval()、XPath()、Bind() などのデータバインディング メソッドは、データバインド コントロールのコンテキストでのみ使用できます」というエラーが表示されました。

これが私がこれまでに持っているものです:

Testing.aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Light.master" 
    AutoEventWireup="true" CodeBehind="Testing.aspx.cs" Inherits="MyProject.Testing" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <dx:ASPxGridView ID="MyGridView" runat="server" KeyFieldName="Name">
        <Columns>
            <dx:GridViewDataColumn FieldName="Name" />
            <dx:GridViewDataColumn FieldName="Level">
                <DataItemTemplate>
                    <dx:ASPxComboBox
                        runat="server"
                        ID="InnerCombo"
                        ValueField="ID"
                        TextField="Desc"
                        ValueType="System.Int32"
                        OnInit="InnerCombo_Init" />
                </DataItemTemplate>
            </dx:GridViewDataColumn>
        </Columns>
    </dx:ASPxGridView>

    <dx:ASPxButton runat="server" ID="btnSubmit" Text="Submit" OnClick="btnSubmit_Click" />
</asp:Content>

Testing.aspx.cs:

public partial class Testing : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
     if (!this.IsPostBack)
     {
        this.MyGridView.DataSource = GetDefaultSettings();
        this.MyGridView.DataBind();
     }
  }

  protected void btnSubmit_Click(object sender, EventArgs e)
  {
     Debug.WriteLine("btnSubmit_Click");

     for (int i = 0; i < MyGridView.VisibleRowCount; i++)
     {
        object[] row = (object[])MyGridView.GetRowValues(i, "Name", "Value");

        // row[1] is null, but we can get the data by finding the combo box itself.
        GridViewDataColumn col = (GridViewDataColumn)MyGridView.Columns["Value"];
        ASPxComboBox innerCombo = (ASPxComboBox)MyGridView.FindRowCellTemplateControl(i, col, "InnerCombo");

        Debug.WriteLine("{0} = {1}", row[0], innerCombo.Value);
     }
  }

  protected void InnerCombo_Init(object sender, EventArgs e)
  {
     Debug.WriteLine("InnerCombo_Init");

     ASPxComboBox innerCombo = sender as ASPxComboBox;
     if (innerCombo != null)
     {
        innerCombo.DataSource = GetValues();
        innerCombo.DataBind();
     }
  }

  private static List<ValueClass> GetValues()
  {
     // Simple for testing; actual method will be database access.
     return new List<ValueClass>()
     {
        new ValueClass(0, "Zero (default)"),
        new ValueClass(1, "One"),
        new ValueClass(2, "Two"),
        new ValueClass(3, "Three"),
     };
  }

  private static List<SettingClass> GetDefaultSettings()
  {
     // Simple for testing; actual method will be database access + post-processing.
     return new List<SettingClass>()
     {
        new SettingClass("AA", 0),
        new SettingClass("BB", 1),
        new SettingClass("CC", 0),
     };
  }

  public class ValueClass
  {
     public int ID { get; private set; }
     public string Desc { get; private set; }

     public ValueClass(int id, string desc)
     {
        this.ID = id;
        this.Desc = desc;
     }
  }

  public class SettingClass
  {
     public string Name { get; set; }
     public int Value { get; set; }

     public SettingClass(string name, int value)
     {
        this.Name = name;
        this.Value = value;
     }
  }
}
4

0 に答える 0