«Повторные» данные отображаются в виде данных - PullRequest
0 голосов
/ 11 марта 2019

Я хочу отобразить мой List<string> в datatable из другой формы.Данные из List<string> взяты из textbox и combobox.Тем не менее, данные из textbox никогда не повторяются, а combobox может быть схож с предыдущими отображаемыми данными.И если это произошло, данные, отображаемые в datatable, будут «повторены» (я не уверен, как это описать). Здесь - фактический результат.Я хотел бы, чтобы мои отображаемые данные были такими, как this .Ниже приведен мой код:

Transavestate - класс, в котором хранится мой список

public static List<string> transnumber_list = new List<string>();
public static List<string> combos_list = new List<string>();

Form1 - форма для ввода пользователем значений textbox и combobox

private void button1_Click(object sender, EventArgs e)
{
 //Save values in the List
 Transavestate.transnumber_list.Add(Textbox1.Text)
 Transavestate.combos_list.Add(comboBox2.SelectedItem.ToString());

 //Go to Form 2
 this.Hide();
 Form2 f2 = new Form2 ();
 f2.Show();
}

Form2 - форма для отображения значений текстового поля и комбинированного списка

private DataSet ds;
private DataTable dt;

    //Method to insert data into dtg1
    private void CreateDataSet()
    {
        ds = new DataSet();
        dt = new DataTable("Vehicle Number");
        dt.Columns.Add("Column 1", typeof(string));
        dt.Columns.Add("Column 2", typeof(string));

        foreach (var item in Transavestate.transnumber_list)
        {
            foreach (var items in Transavestate.combos_list)
            {
                dt.Rows.Add(item, items);
            }
        }

        ds.Tables.Add(dt);
        this.dataGridView1.DataSource = dt;
        dataGridView1.AllowUserToAddRows = false;
   }

    //To run the method
    private void dataGridView1_VisibleChanged(object sender, EventArgs e)
    {
        CreateDataSet();
    }

    //Go back to Form1
    private void button2_Click(object sender, EventArgs e)
    {
        this.Hide();
        Form1 f1 = new Form1();
        f1.Show();
    }

1 Ответ

0 голосов
/ 11 марта 2019

Мне кажется, что у вас есть две последовательности строк: последовательность transNumbers и последовательность comboItems (на самом деле это ваш transnumber_list и ваш combos_list, но я не хочу ограничивать себя факт, что они являются списками, а имена противоречивы (первое не множественное число, второе - множественное число?)

В любом случае, вы говорите, что ваша последовательность transNumbers содержит только уникальные элементы, но ваш comboItems может содержать дубликаты (основанные на некотором компараторе равенства строк)

Примерно так:

IEnumerable<string> transNumbers = new string[] {"1", "2"};
IEnumerable<string> comboItems = new string[] {"A", "A", "A", "B", "A", "B"};

В результате вы хотите что-то вроде:

TransNumber ComboItem
    "1"        "A"
    "1"        "B"
    "2"        "A"
    "2"        "B"

То есть вы хотите объединить все TransNumber с каждым уникальным comboItem. Порядок, кажется, не важен.

С LINQ Это довольно просто. Мы будем использовать Enumerable.SelectMany для объединения двух последовательностей, и мы будем использовать Enumerable.Distinct , чтобы избавиться от ваших дубликатов

// SelectMany:
// parameter source: transNumbers
// parameter collectionSelector: comboItems without Duplicates
var transNumberCombiItemCombinations = transNumbers.SelectMany(

    // collectionSelector: comboItems without duplicates
    combiItems.Distinct(),

    // ResultSelector, take a transNumber from the source,
    // and a comboItem from collectionSelector to make a new object
    (transNumber, comboItem => new
    {
        Column1 = transNumber,
        Column2 = comboItem,
    });

Если вы удалите все комментарии, вы увидите, что это действительно небольшой фрагмент кода.

Distinct удалит дубликаты. Если вы считаете "myname" и "MYNAME" равными, вам нужно указать IEqualityComparer<string>, например StringComparer.OrdinalIgnoreCase.

SelectMany "сделает ваше foreach inside foreach.

resultSelector примет один transNumber и один comboItem в качестве входных данных для создания желаемого результата. В этом случае один объект имеет два свойства: Column1 и Column2.

Результатом является IEnumerable. Все, что вам нужно сделать, это перечислить его в список или что-то еще и добавить результат в вашу коллекцию строк:

dt.Rows.AddRange(transNumberCombiItemCombinations.ToList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...