c# DataGridView проблемка:(

apxx

есть DataGridView, заполняется из массива s. Содержимое массива меняется а вот что первый раз вывелось на экран больше не меняется. Вывожу так:
while (num<1000)
{
DataGridViewTextBoxCell txtCell = (DataGridViewTextBoxCell)_grid.Rows[num].Cells[0];
txtCell.Value = (s[num, 0]);
num++
}
как лучше решить такое? почему старые значения не затираются?:(

Alex28051973

Попробуй использовать виртуальный режим.

klyv

По-хорошему, надо бы BindingSource использовать...

olegusmaximus

http://www.gotdotnet.ru/LearnDotNet/WinForms/597.aspx
либо на МСДН читать про databinding, как уже заметили.

apxx

про databinding все понятно, но интересует именно этот вопрос
как при таком раскладе обновить таблицу?
пробовал вставлять

_grid.SelectAll;
_grid.ClearSelection;
_grid.Refresh;

все без толку. Таблица всегда остается такой как после первого заполнения

Dasar

что-то ты делаешь не правильно, проблема где-то в твоем коде, а не в гриде.
грид должен все сразу обновлять во время присваивания без всяких refresh-ей.
показывай код целиком

Dasar

режим телепатии (скорее всего данные из старого массива выводишь, а не из нового).

apxx


using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Net;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
string qwe;

public Form1
{
InitializeComponent;

}

public void Form1_Load(object sender, EventArgs e)
{


}

private string[,] data(string stroka)
{
int i, n = 0, n1 = 0, razmer = 0;


string[,] dannie = new string[,]
{{"02bebefe-13e9-4f3c-94bb-49b0cb8faad8", "00-19-A6-FA-D7-B9"},
{"05b4f043-4303-4024-a2c5-b127cce6510a", "00-19-A6-FA-D7-C0"},
{"9eb86de0-f714-42f1-897c-b3f5495cc154", "00-19-A6-FA-D5-4B"},
{"52c5eabc-c64e-438e-8484-5251070bba20", "00-1B-DD-F0-0C-2A"}};



string[,] temp = new string[dannie.Length / 2, 2];
i = dannie.Length / 2;
int num = 0;
string a, b;
while (n <= i - 1)
{
a = dannie[n, 0];
b = dannie[n, 1];
if (a.Contains(stroka) || b.Contains(stroka
{
temp[num, 0] = dannie[n, 0];
temp[num, 1] = dannie[n, 1];
n1 = 1;
num++;
}

if (n1 == 1)
{
razmer++;
n1 = 0;
}
n++;

}


string[,] rezult = new string[razmer, 2];
int z = 0;
while (z <= razmer-1)
{

rezult[z, 0] = temp[z, 0];
rezult[z, 1] = temp[z, 1];
z++;
}
return (rezult);



}

public void textBox1_TextChanged(object sender, EventArgs e)
{
qwe = textBox1.Text;
main (qwe);

}
private void main(string qwe)
{
string[,] s = null;

if (qwe == null) { qwe = "00"; }
s = data(qwe);
DataGridView _grid = new DataGridView;
_grid.Dock = DockStyle.Fill;
_grid.AllowUserToAddRows = false;
Controls.Add(_grid);
_grid.Columns.Add(new DataGridViewTextBoxColumn;
_grid.Columns[0].HeaderText = "GUID";
_grid.Columns[0].Width = 215;
_grid.Columns.Add(new DataGridViewTextBoxColumn;
_grid.Columns[1].HeaderText = "MAC";
_grid.Columns[1].Width = 103;
_grid.Columns.Add(new DataGridViewButtonColumn;
_grid.Columns[2].HeaderText = "данные ";

_grid.Rows.Add;


for (int i = 0; i <= s.Length / 2 - 2; i++)
{
DataGridViewRow heter_row = new DataGridViewRow;

for (int j = 0; j < _grid.Columns.Count; j++)
heter_row.Cells.Add(new DataGridViewTextBoxCell;


_grid.Rows.Add(heter_row);

}

int num = 0;

DataGridViewRow row0 = _grid.Rows[0];

while (num <= s.Length / 2 - 1)
{
label1.Text = Convert.ToString(num);
DataGridViewTextBoxCell txtCell = (DataGridViewTextBoxCell)_grid.Rows[num].Cells[0];
txtCell.Value = (s[num, 0]);
_grid.Rows[num].Cells[1].Value = (s[num, 1]);

num++;
}

}


}
}

label1 там просто для проверки (массив обновляется)
в textBox1 вводятся данные, по совпадению возвращается массив с новыми данными

Dasar

private void main(string qwe)
     {
...
     DataGridView _grid = new DataGridView;
...
     Controls.Add(_grid);
вот это неправильно.
ты каждый раз вставляешь новый grid в форму и именно в новом гриде меняешь данные, соответственно этот новый грид выводится под предыдущими гридами, поэтому ты и не видишь изменений.
вынеси создание грида в конструктор, а еще лучше вставь грид через дизайнер

Dasar

для геологического сойдет, но посоветую следующее:
1. while-ы заменить на for-ы

for (int n = 0; n < i; ++n)
{
}

вместо

int i, n = 0, n1 = 0, razmer = 0;
while (n <= i - 1)
{
..
n++;

}

2. в условиях цикла использовать <, а <=
n < i, вместо n <= i-1
3. вместо двухмерного массива использовать массив классов

class Item
{
public Item{}
public Item(string id, string mac){this.Id = id;this.Mac = mac; }
public string Id;
public string Mac;
}
Item[] dannie = new Item[]{
new Item("02bebefe-13e9-4f3c-94bb-49b0cb8faad8", "00-19-A6-FA-D7-B9"
...
}

4. использовать говорящие имена вместо i,a,b и n
5. переменные объявлять в том блоке, где они используются, при первой реальной инициализации, а не в самом начале метода

klyv

3. вместо двухмерного массива использовать массив классов
А не Dictionary? ;)

Dasar

> А не Dictionary?
нет, конечно.
dictionary - нужен только в одном случае, если нужно обеспечить быстрый доступ по уникальному ключу.

apxx

а как системе отдать http адрес? соответственно чтоб запускался дефолтный браузер с этой ссылкой?
ЗЫ хочу повесить обработчик клика, чтоб при этом, исходя их данных, генерируется ссылка и отдается винде

apxx

up :)

klyv

up :)
Process.Start

apxx

Process.Start
енто то понятно, мне интересует как скормить ссылку чтоб открылся дефолтный браузер. Вытаскивать инфу из реестра не очень хочется

klyv

Process.Start("тут://сцылко")
Оставить комментарий
Имя или ник:
Комментарий: