3

我需要将动态创建的文本框数组绑定到字符串[] 或 List<string>。这是与List<T> 问题最接近的 WinForm 控件绑定,但没有雪茄。

通常对于单个文本框,我绑定文本框的 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

TextBox您可以将 aDataTable与单行一起使用,而不是用于保存值的字符串数组。这样,您不必增加Engine类的复杂性(因为它仍然有一个属性),并且您可以将文本框绑定到engine.DataTable's DataColumnCollection(通过列的索引映射它们)。

试试这个形式:

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 回答