Masalah dengan DataGridView di C# Winforms

Saya mengalami masalah dengan DataGridView.

Pertama, seperti yang Anda lihat:
Saya mentransfer informasi dari array DataGridView ke Info_Goods. Saya memeriksanya dengan cermat, itu sepenuhnya mentransfer semua informasi yang saya butuhkan.

Tetapi ketika saya menggunakan foreach untuk menulis informasi dari array Info_Goods ke text.txt, hanya informasi dari baris pertama yang ditulis. Saya membuat array berbeda, nama testArray dengan beberapa elemen telah dibuat sebelumnya

contoh:

string[,] testArray = {{a,b,c}, {d,e,f}};

Itu menulis sepenuhnya informasi testArray. Saya tidak tahu apa yang terjadi.

string Name = "";
Name = tb_Name.Text;

string[,] Info_Goods = new string[50, 50];

int Number = 1;

for (int i = 0; i < dgv_Input.Rows.Count - 1; i++)
{
  for (int j = 0; j < dgv_Input.Columns.Count - 1; j++)
  {
    Info_Goods[i, j] = dgv_Input.Rows[i].Cells[j].Value.ToString();
  }
}

////================================ Write File 
 // string[,] test = { { "a", "b", "c" }, { "d", "e", "f" } };  // it worked
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(Number.ToString() + " " + Name + ".txt"))
{
  foreach (string s in Info_Goods)      // it didn't worked
  {
    sw.WriteLine(s);
  }
}

Kedua, saya ingin memeriksa elemen kosong di DataGridView dan menampilkan pemberitahuan kesalahan.

Seperti yang Anda lihat, saya menggunakan loop yang sama seperti yang saya gunakan saat mentransfer informasi dari DataGridView ke Info_Goods array .

Saya menggunakan 1 variabel cek (1: elemen kosong dan 0: tidak kosong). Itu tidak berhasil

Namun ketika saya hanya menulis pernyataan IF (tidak menggunakan loop), berhasil.

int check = 0;

for (int a = 0; a < dgv_Input.Rows.Count - 1; a++)
{
  for (int b = 0; b < dgv_Input.Columns.Count - 1; b++)
  {
    if (string.IsNullOrEmpty(dgv_Input.Rows[a].Cells[b].Value as string))   // it didn't work
    {
      check = 1;
    }
  }
}
// if (string.IsNullOrEmpty(dgv_Input.Rows[0].Cells[0].Value as string)) // it worked

person Thang Nguyen    schedule 21.02.2017    source sumber


Jawaban (2)


Untuk kode pertama Anda, tidak jelas mengapa Anda menggunakan array string [50,50]? DataGridView dgv_Input sepertinya merupakan cara yang lebih baik untuk mengukur array. Atau lebih baik lagi gunakan daftar. Menggunakan array seperti Anda akan membuat nilai null untuk banyak elemen dalam array atau kemungkinan overflow. Katakanlah ada 4 kolom dan 5 baris data di dgv_Input, Array string[50,50] akan terlihat seperti di bawah ini setelah Anda membaca sel ke dalam array seperti yang dilakukan kode:

[0,0] data0 col1
[0,1] data0 col2
[0,2] data0 col3
[0,3] data0 col4
[0,4] null
[0,5] null
[0,6] null
   …….
[0,47] null
[0,48] null
[0,49] null
[1,0] data1 col1
[1,1] data1 col2
[1,2] data1 col3
[1,3] data1 col4
[1,4] null
[1,5] null
[1,6] null

Ini jelas banyak ruang yang terbuang dan jaminan untuk nilai/string nol. Saat Anda mencoba menulis array ini ke file, Anda harus memeriksa nilai null ini dengan:

If (s != null)…

Anda mungkin ingin memikirkan kembali bagaimana Anda ingin menyimpan string dari DataGridView… Saya memperkirakan 1 string untuk setiap baris dan mungkin menyimpannya di List karena Anda mungkin tidak tahu berapa banyak di sini.

Untuk masalah kedua Anda, saya kira masalahnya ada pada baris kode berikut:

string.IsNullOrEmpty(dgv_Input.Rows[a].Cells[b].Value as string)

Saya rasa ini tidak mengembalikan apa yang Anda harapkan. Pertama, ada kemungkinan bagus bahwa dgv_Input.Rows[a].Cells[b].Value mungkin nol. Saya menyadari bahwa baris tersebut tampaknya menanyakan apakah STRING bernilai nol IsNullOrEmpty. Juga baris di atas akan mengembalikan nilai true jika nilai dalam sel DataGridView adalah angka. Dengan kata lain, baris di atas sepertinya tidak berfungsi sebagaimana mestinya. Di bawah ini saya memecah kode untuk memeriksa nilai mana yang nol atau nilai mana yang merupakan string kosong. Tampaknya ini berfungsi seperti yang diharapkan

for (int a = 0; a < dataGridView1.Rows.Count -1 ; a++) {
  for (int b = 0; b < dataGridView1.Columns.Count; b++) {
    if (dataGridView1.Rows[a].Cells[b].Value != null) {
      if (dataGridView1.Rows[a].Cells[b].Value.ToString() != "") {
        textBox1.Text += dataGridView1.Rows[a].Cells[b].Value.ToString() + ",";
      } else {
       // MessageBox.Show("String is empty: ");
      }
    } else {
      //MessageBox.Show("DGV Cell Value is null: ");
    }
  }
  textBox1.Text += Environment.NewLine;
}
person JohnG    schedule 21.02.2017
comment
mengikuti cara yang diberikan tomato32 kepada saya, saya memperbaiki kesalahan masalah kedua itu. Tapi saya sangat berterima kasih atas bantuan dan ilmu yang Anda bagikan, saya hanya ingin mengucapkan terima kasih!! - person Thang Nguyen; 21.02.2017

Anda harus memodifikasi loop seperti di bawah ini. Dan kemudian akan berjalan dengan baik, sobat.

for (int i = 0; i < dgv_Input.Rows.Count; i++)
{
  for (int j = 0; j < dgv_Input.Columns.Count; j++)
  {
    Info_Goods[i, j] = dgv_Input.Rows[i].Cells[j].Value.ToString();
  }
}
person Tomato32    schedule 21.02.2017
comment
Entah kenapa tapi itu membantu saya untuk menyelesaikan masalah saya yang ke 2, terima kasih banyak gan. Tapi menurut saya cara itu tidak berhasil pada masalah pertama saya karena di datagridview saya, kolom terakhir adalah tombol dan baris terakhir adalah baris kosong, itulah sebabnya saya menggunakan dgv_Input.Rows.Count - 1 dan dgv_Input.Columns.Count - 1 alih-alih dgv_Input.Rows.Count dan dgv_Input.Columns.Count - person Thang Nguyen; 21.02.2017
comment
Apakah Anda sedang membuat aplikasi untuk tampilan kisi yang dapat diedit, bukan? Lalu, ketika tombol diklik, tampilkan validasi? - person Tomato32; 21.02.2017
comment
Sama seperti itu. Ide saya adalah jika saya mengklik tombol, satu baris akan dihapus. Tapi saya akan membangun fitur itu nanti. Sekarang saya harus menemukan cara menulis semua nilai array Info_Goods ke text.txt karena hanya menulis 1 elemen array itu :(( sosad - person Thang Nguyen; 21.02.2017
comment
Kamu menggunakan Skype? Tambahkan saja nama panggilan saya, manhtran32. Mungkin saya bisa mendukung :)) - person Tomato32; 21.02.2017
comment
trời đất người việt à , sao ko dùng tiếng việt luôn đi rep comment đi anh :)). Apa yang mungkin tidak terjadi pada kode ini dan itu - person Thang Nguyen; 21.02.2017