M Ridwan Dwi Septian Ответов: 2

Берите только данные одного типа (datatable)


Я хочу проверить сетку и отобразить ее в datatable: если NPM уже существует, то данные не будут введены в datatable

у меня есть данные в сетке

НПМ
123
121
122
124
124
124
128

нужен объект DataTable, как это

НПМ
123
121
122
124
128

но мой код всегда получает все данные. пожалуйста помочь

Что я уже пробовал:

DataTable dt = new DataTable();

            dt.Columns.Add("NPM");
            grd2.DataSource = dt;

            string NPM = "";
            string NPM_CEK = "";

            for (int i = 0; i < grd.Rows.Count - 1; i++)
            {
                NPM = grd.Rows[i + 1]["NPM"].ToString();

                DataRow row = dt.NewRow();
                dt.Rows.Add(row);

                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    NPM_CEK = dt.Rows[j]["NPM"].ToString();

                    if (NPM_CEK == NPM)
                    {
                        
                    }
                    else
                    {
                        grd2.Rows[i + 1]["NPM"] = NPM;
                    }
                }
            }

            grd2.AutoSizeCols();

2 Ответов

Рейтинг:
7

Maciej Los

Вы можете фильтровать данные в сетке с помощью объект DataTable.метод Select[^], который возвращает массив объектов DataRow.

//get source datatable
DataTable srcdt = (DataDatable)grid.DataSource;
//create destination datatable -> a datasource for grid2
DataTable dstdt = new DataTable();
dstdt.Columns.Add(new DataColumn("NPM", typeof(int)));
for(int i=0; i<srcdt.Rows.Count;i++)
{
	var processedNPM = srcdt.Rows[i][0]; //replace 0 with correct column number
	var npmcheck = dstdt.Select(string.Format("NPM={0}", processedNPM)).FirstOrDefault();
	if(npmcheck!=null) 
	{
		//row already exists in a destination table! Do NOT add it!
	}
	else
	{
		dstdt.Rows.Add(srcdt.Rows[i].Clone());
	}
}


Другой способ-использовать Linq:
dstdt = srcdt.AsEnumerable()
	.GroupBy(x=>x.Field<int>("NPM")) //grou data by NMP field
	.Select(grp=>dstdt.LoadDataRow(new object[]{grp.Key}, false)) //get distinct data 
	.CopyToDataTable();


Примечание: изменение x.Field<int>("NPM") например, к вашему типу данных: x.Field<string>("NPM") - если NMP поле - это тип строки.

Удачи вам!


Рейтинг:
1

OriginalGriff

Вы всегда устанавливаете все данные в качестве источника данных:

grd2.DataSource = dt;

И тогда вы всегда добавляете все строки в DataTable:
for (int i = 0; i < grd.Rows.Count - 1; i++)
{
    NPM = grd.Rows[i + 1]["NPM"].ToString();

    DataRow row = dt.NewRow();
    dt.Rows.Add(row);
Если вы не хотите скандала, не добавляйте его!