我想以另一种形式在List<string>
中显示我的datatable
。来自List<string>
的数据来自textbox
和combobox
。但是,不会重复来自textbox
的数据,但是combobox
可能与显示的先前数据相似。如果发生这种情况,datatable
中显示的数据将被“重复”(我不确定如何描述)。 Here是实际结果。我希望看到的显示数据类似于this。下面是我的代码:
Transavestate -保存我的列表的类
public static List<string> transnumber_list = new List<string>();
public static List<string> combos_list = new List<string>();
Form1 -用户输入文本框和组合框的值的形式
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();
}
答案 0 :(得分:0)
在我看来,您有两个字符串序列:一个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());