Datagridview, показывать только уникальные значения были повторяющиеся значения ячеек C # 2005 - PullRequest
1 голос
/ 30 декабря 2011

У меня есть некоторые проблемы с отображением значений, но каждый раз, когда он дублирует значения в сетке данных, я использую Microsoft Visual C # 2005 и framework 2.0.

При программировании я обнаружил, что внутри циклаМне нужно проверить наличие дублированных значений и подсчитать их, и если появится новое значение, отобразите значение и отправьте письмо, у меня есть код для почты через smtp, но мне нужно, чтобы дублированные значения были подсчитаны и удалены только при сохранении оригинала.ячейка и обновление остального, это возможно, это код, который подключен к сетке и генерации данных, мне нужна серьезная помощь с этим, потому что я не нашел правильный код в Интернете, чтобы сделать эту работу эффективно.

  try
            {

                e.Result = "";

                //int count1 = 0;
                int val = 6000;

                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("ComputerName", typeof(String)));          //0
                dt.Columns.Add(new DataColumn("IP", typeof(String)));            //1
                dt.Columns.Add(new DataColumn("MAC", typeof(String)));       //2
                dt.Columns.Add(new DataColumn("Descubierto", typeof(String)));  

                for (int a = 1; a <= val; a++)


                {


                    counter.Text = Convert.ToString(a);
                    if (txtWorkGroupName.Text == "") return;

                    //DataTable dt = new DataTable();
                    //dt.Clear();


                        //3
                    //int i = 0;


                    try
                    {
                        // Datos del grupo WinNT://&&&&(Nombre del grupo de trabajo)
                        DirectoryEntry DomainEntry = new DirectoryEntry("WinNT://" + txtWorkGroupName.Text + "");
                        DomainEntry.Children.SchemaFilter.Add("Computer");



                        ///*************************************************
                        /// Interacting with the pcs in the domain
                        ///*************************************************

                        foreach (DirectoryEntry machine in DomainEntry.Children)
                        {

                            string strMachineName = machine.Name;
                            string strMACAddress = "";
                            IPAddress IPAddress;
                            DateTime discovered;

                            try
                            {
                                IPAddress = getIPByName(machine.Name);

                            }
                            catch
                            {
                                continue;
                            }//try/catch

                            ///*************************************************
                            /// Get Mac
                            ///*************************************************
                            strMACAddress = getMACAddress(IPAddress);

                             ///*************************************************
                            /// discovered time
                            ///*************************************************
                            discovered = DateTime.Now;


                            ///*************************************************
                            /// Add the data to the datagridview
                            ///*************************************************

                            DataRow dr = dt.NewRow();


                            dr[0] = machine.Name;
                            dr[1] = IPAddress;
                            dr[2] = strMACAddress;
                            dr[3] = Convert.ToString(discovered);
                            dt.Rows.Add(dr);



                            dgvComputers1.DataSource = dt;



                            dgvComputers1.Refresh();

                   ///Using Unique doesent work, this was one of the solutions found
                            //dt.Columns(machine.Name).Unique = true;
                            //dt.Columns(IPAddress).Unique = true;
                            //dt.Columns(strMACAddress).Unique = true;



                        }//foreach loop


                       // DataView dv = new DataView();

                       // dv = dt;

                        Thread.Sleep(2000);

                        //dt = ((DataView)this.dgvComputers1.DataSource).Table;
                        //dt.WriteXml(@"testermac.xml");




                    }//try/catch

                    catch (Exception ex)
                    {
                        {
                            MessageBox.Show(ex.Message);
                        }
                    }


                    if (backgroundWorker2.CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }

                }

            }
            catch (NullReferenceException ex)
            {
                MessageBox.Show("error:" + ex);
                //tbmessage.Text += "se ha producido un error: " + ex + Environment.NewLine;
                //tbmessage.SelectionStart = tbmessage.Text.Length;
                //tbmessage.ScrollToCaret();
            }
            catch (NoNullAllowedException ex)
            {
                MessageBox.Show("error:" + ex);
            }
            catch (AccessViolationException ex)
            {
                MessageBox.Show("error:" + ex);
            }


        }

1 Ответ

3 голосов
/ 31 декабря 2011

Вместо добавления новой строки каждый раз, попробуйте использовать DataTable.Select или DataTable.Rows.Find, чтобы проверить наличие дубликатов.Если дубликатов нет, добавьте новую новую строку, если она уже существует, просто обновите другие столбцы.

Кроме того, вы устанавливаете источник данных на каждой итерации цикла, вам нужно сделать это только один раз.

Вот простой неполный пример, который обновляет сетку каждую секунду, вы должнывозможность адаптировать логику здесь для вашей программы.

    public partial class Form1 : Form
    {
        private readonly DataGridView _gridView;
        private readonly DataTable _dataTable;

        public Form1()
        {
            InitializeComponent();

            _dataTable = new DataTable();
            DataColumn computerColumn = new DataColumn("Name");
            _dataTable.Columns.Add(computerColumn);
            _dataTable.Columns.Add(new DataColumn("IP"));
            _dataTable.Columns.Add(new DataColumn("MAC"));
            _dataTable.Columns.Add(new DataColumn("Descubierto"));
            _dataTable.PrimaryKey = new [] { computerColumn };

            _gridView = new DataGridView
                            {
                                Dock = DockStyle.Fill,
                                DataSource = _dataTable
                            };
            Controls.Add(_gridView);

            System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
            timer.Interval = 1000;
            timer.Tick += TimerTick;     
            timer.Start();
        }

        void TimerTick(object sender, EventArgs e)
        {
            DirectoryEntry domainEntry = new DirectoryEntry("WinNT://mydomain"); 
            domainEntry.Children.SchemaFilter.Add("Computer"); 

            _dataTable.BeginLoadData();

            foreach (DirectoryEntry machine in domainEntry.Children) 
            { 
                DataRow row = _dataTable.Rows.Find(machine.Name);

                if(row == null)
                {
                    row = _dataTable.NewRow();
                    row[0] = machine.Name;
                    _dataTable.Rows.Add(row);
                }

                row[3] = DateTime.Now.ToString();
            }

            _dataTable.EndLoadData();
        } 
    }
...