3

動的に作成されたテキスト ボックスの配列を string[] または List<string> にバインドする必要があります。これはList<T> 問題に最も近い WinForm コントロール バインドでしたが、葉巻はありませんでした。

通常、単一のテキスト ボックスの場合、Textbox の Text プロパティをバインドします。

Engine engine = new Engine();
public frmMain()
{
    InitializeComponent();

    txtQuery.DataBindings.Add("Text",engine,"Query");
}

クラス プロパティへ:

public class Engine : IEngine, INotifyPropertyChanged
{
 private string query;
 public string Query
 {
    get { return query; }
    set
    {
        query = value;
        InvokePropertyChanged(new PropertyChangedEventArgs("Query"));
    }
 }

 public event PropertyChangedEventHandler PropertyChanged;
 public void InvokePropertyChanged(PropertyChangedEventArgs e)
 {
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null) handler(this, e);
 }
}

テキストボックスと文字列の配列を試してみましたが、うまくいきませんでした:

フロントエンド:

TextBox[] txtBoxArr = new TextBox[numberOfDimensions];
for (int i = 0; i < numberOfDimensions;i++)
{
    string tabName = "Dataset" + (i + 1);
    tabCtrlDatasets.TabPages.Add(tabName,tabName);
    txtBoxArr[i] = new TextBox();
    txtBoxArr[i].Name = "txtDataset" + i ;
    txtBoxArr[i].DataBindings.Add("Text",engine,"Dataset");
    tabCtrlDatasets.TabPages[i].Controls.Add(txtBoxArr[i]);
}

バックエンド:

private string[] dataset;
public string[] Dataset
{
    get { return dataset; }
    set
    {
        dataset = value;
        InvokePropertyChanged(new PropertyChangedEventArgs("Dataset"));
    }
}

それを機能させるには、配列内の項目のインデックスを知る必要があります。以前にこれを行ったことを思い出せません。テキストボックスのインデックスを特定して文字列配列の正しい項目にバインドする方法を知っている人はいますか?

今日は少し疲れていて、メモリー ブロックがあります。

4

1 に答える 1

1

値を保持するための文字列配列の代わりに、単一の行で a をTextBox使用できます。DataTableこのように、Engineクラスの複雑さを増す必要はなく (プロパティは 1 つであるため)、テキスト ボックスを にバインドできます(列engine.DataTableDataColumnCollectionインデックスによってそれらをマッピングします)。

次の形式でこれを試してください。

Engine engine = new Engine();

public Form1()
{
    InitializeComponent();

    var dt = new DataTable();
    dt.Columns.Add("column0");
    dt.Columns.Add("column1");
    dt.Columns.Add("column2");
    dt.Rows.Add("abc", DateTime.Now, 123456, 789.0123F);
    engine.DataTable = dt;

    int numberOfDimensions = engine.DataTable.Columns.Count;
    TextBox[] txtBoxArr = new TextBox[numberOfDimensions];
    for (int i = 0; i < numberOfDimensions; i++)
    {
        string tabName = "Dataset" + (i + 1);
        tabCtrlDatasets.TabPages.Add(tabName, tabName);
        txtBoxArr[i] = new TextBox();
        txtBoxArr[i].Name = engine.DataTable.Columns[i].ColumnName;
        txtBoxArr[i].DataBindings.Add("Text", 
            engine.DataTable, txtBoxArr[i].Name);
        tabCtrlDatasets.TabPages[i].Controls.Add(txtBoxArr[i]);
    }
}

Engineクラスを次のように変更します。

private DataTable dataTable;
public DataTable DataTable
{
    get
    {
        return dataTable;
    }
    set
    {
        dataTable = value;
        InvokePropertyChanged(new PropertyChangedEventArgs("DataTable"));
    }
}
于 2013-02-26T09:20:05.493 に答える