c# DataGridView проблемка:(
Попробуй использовать виртуальный режим.
По-хорошему, надо бы BindingSource использовать...
http://www.gotdotnet.ru/LearnDotNet/WinForms/597.aspx
либо на МСДН читать про databinding, как уже заметили.
либо на МСДН читать про databinding, как уже заметили.
как при таком раскладе обновить таблицу?
пробовал вставлять
_grid.SelectAll;
_grid.ClearSelection;
_grid.Refresh;
все без толку. Таблица всегда остается такой как после первого заполнения
грид должен все сразу обновлять во время присваивания без всяких refresh-ей.
показывай код целиком
режим телепатии (скорее всего данные из старого массива выводишь, а не из нового).
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 вводятся данные, по совпадению возвращается массив с новыми данными
private void main(string qwe)вот это неправильно.
{
...
DataGridView _grid = new DataGridView;
...
Controls.Add(_grid);
ты каждый раз вставляешь новый grid в форму и именно в новом гриде меняешь данные, соответственно этот новый грид выводится под предыдущими гридами, поэтому ты и не видишь изменений.
вынеси создание грида в конструктор, а еще лучше вставь грид через дизайнер
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. переменные объявлять в том блоке, где они используются, при первой реальной инициализации, а не в самом начале метода
3. вместо двухмерного массива использовать массив классовА не Dictionary?
нет, конечно.
dictionary - нужен только в одном случае, если нужно обеспечить быстрый доступ по уникальному ключу.
ЗЫ хочу повесить обработчик клика, чтоб при этом, исходя их данных, генерируется ссылка и отдается винде
up
upProcess.Start
Process.Startенто то понятно, мне интересует как скормить ссылку чтоб открылся дефолтный браузер. Вытаскивать инфу из реестра не очень хочется
Process.Start("тут://сцылко")
Оставить комментарий
apxx
есть DataGridView, заполняется из массива s. Содержимое массива меняется а вот что первый раз вывелось на экран больше не меняется. Вывожу так:while (num<1000)
{
DataGridViewTextBoxCell txtCell = (DataGridViewTextBoxCell)_grid.Rows[num].Cells[0];
txtCell.Value = (s[num, 0]);
num++
}
как лучше решить такое? почему старые значения не затираются?:(