Заполните текстовые поля данными из комбинированного списка, связанного с xml - PullRequest
0 голосов
/ 24 октября 2019

Я получаю поле со списком, чтобы показать «Имя», но при нажатии на имя, «тип» и «живой» не хочет отображаться в текстовых полях.

Кроме того, есть лиспособ заставить это работать без <'data> <' / data> в xml?

data.xml

    <?xml version="1.0"?>
    <Data>
    <Start Name="Anaconda" type="Snake" living="Nowhere" />
    <Start Name="Sphynx" type="Cat" living="Everywhere" />
    <Start Name="Amanita muscaria" type="Fungus" living="Woodstock" />
    </Data>

код C #:

    public Form1()
    {
        InitializeComponent();

        DataSet dataSet = new DataSet();
        dataSet.ReadXml("data.xml");
        this.comboBox1.DataSource = dataSet.Tables[0];
        this.comboBox1.DisplayMember = "Name";
    }

1 Ответ

1 голос
/ 25 октября 2019

Это заголовок, в котором значения привязаны к некоторым текстовым полям:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        var dataSet = new DataSet();
        var bindingSource = new BindingSource();
        bindingSource.DataSource = dataSet.ReadXml("data.xml");

        comboBox1.DisplayMember = "Name";
        comboBox1.DataSource = dataSet.Tables[0];

        tbName.DataBindings.Add("Text", comboBox1.SelectedItem, "Name");
        tbType.DataBindings.Add("Text", comboBox1.SelectedItem, "type");
        tbLiving.DataBindings.Add("Text", comboBox1.SelectedItem, "living");
    }
}

РЕДАКТИРОВАТЬ:

Полный пример помещает содержимое чтения XML-файла в класс и связываетко всем элементам управления.

Привет @Jimi для Привязка TextBox к ListBox SelectedItem . Это очень помогло как ориентация.

public partial class Form1 : Form
{
    #region Private Members

    /// <summary>
    /// The content list to bind to.
    /// </summary>
    private BindingList<Data> mData = null;

    /// <summary>
    /// The item to bind to.
    /// </summary>
    private BindingSource mDataSource = null;

    #endregion

    #region Constructor

    /// <summary>
    /// Default constructor.
    /// </summary>
    public Form1()
    {
        InitializeComponent();

        // Get binding content
        mData = GetXmlData("data.xml");

        // Prepare the binding source from the read content
        mDataSource = new BindingSource(mData, null);

        // Set what is to be displayed
        comboBox1.DisplayMember = "Name";
        comboBox1.DataSource = mDataSource;

        // Bind textboxes
        tbName.DataBindings.Add(new Binding("Text", mDataSource, "Name", false, DataSourceUpdateMode.OnPropertyChanged));
        tbType.DataBindings.Add(new Binding("Text", mDataSource, "type", false, DataSourceUpdateMode.OnPropertyChanged));
        tbLiving.DataBindings.Add(new Binding("Text", mDataSource, "living", false, DataSourceUpdateMode.OnPropertyChanged));
    }

    #endregion

    /// <summary>
    /// Reads the provided XML file and puts it into a structured binding list.
    /// </summary>
    /// <returns></returns>
    private BindingList<Data> GetXmlData(string xmlFile)
    {
        // Create a data set and read the file
        var dataSet = new DataSet();
        dataSet.ReadXml(xmlFile);

        // Convert the content to a List<Data>
        var data = dataSet.Tables[0].AsEnumerable().Select(r => new Data
        {
            Name = r.Field<string>("Name"),
            Type = r.Field<string>("type"),
            Living = r.Field<string>("living")
        }).ToList();

        // Return the content as BindingList<Data>
        return new BindingList<Data>(data);
    }
}

В этом случае вам понадобится класс для помещения содержимого файла. Класс Data выглядит следующим образом:

/// <summary>
/// The structure of a read XML file.
/// </summary>
public class Data
{
    /// <summary>
    /// The name of an item.
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// The type of an item.
    /// </summary>
    public string Type { get; set; }

    /// <summary>
    /// The living space of an item.
    /// </summary>
    public string Living { get; set; }
}

Ранее упоминалось, что для работы с двойными данными необходим уникальный идентификатор. Здесь нет. Поле со списком привязывается к объектам Data и является уникальным для себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...