ปัญหากับ DataGridView ใน C # Winforms

ฉันมีปัญหากับ DataGridView

อันดับแรก อย่างที่คุณเห็น:
ฉันกำลังถ่ายโอนข้อมูลจากอาร์เรย์ DataGridView ไปยัง Info_Goods ฉันตรวจสอบอย่างระมัดระวัง มันถ่ายโอนข้อมูลทั้งหมดที่ฉันต้องการได้อย่างสมบูรณ์

แต่เมื่อฉันใช้ foreach เพื่อเขียนข้อมูลของอาร์เรย์ Info_Goods ไปที่ text.txt จะมีการเขียนเฉพาะข้อมูลของแถวแรกเท่านั้น ฉันสร้างอาร์เรย์อื่นชื่อ testArray โดยมีองค์ประกอบบางอย่างเคยสร้างมาก่อน

ตัวอย่าง:

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

มันเขียนข้อมูลของ testArray อย่างสมบูรณ์ ฉันไม่รู้ว่าเกิดอะไรขึ้น

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);
  }
}

ประการที่สอง ฉันต้องการตรวจสอบองค์ประกอบว่างใน DataGridView และแสดงการแจ้งเตือนข้อผิดพลาด

อย่างที่คุณเห็น ฉันกำลังใช้ลูปแบบเดียวกับที่ฉันใช้เมื่อถ่ายโอนข้อมูลจาก DataGridView ไปยัง Info_Goods array

ฉันใช้ตัวแปรตรวจสอบ 1 ตัว (1: องค์ประกอบว่างและ 0: ไม่ว่างเปล่า) มันไม่ทำงาน

แต่เมื่อฉันเขียนเฉพาะคำสั่ง IF (ไม่ใช้ลูป) มันก็ใช้งานได้

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 แหล่งที่มา


คำตอบ (2)


สำหรับโค้ดแรกของคุณ ไม่ชัดเจนว่าเหตุใดคุณจึงใช้อาร์เรย์สตริงเป็น [50,50] DataGridView dgv_Input ดูเหมือนจะเป็นวิธีที่ดีกว่าในการกำหนดขนาดอาร์เรย์ หรือดีกว่ายังใช้รายการ การใช้อาร์เรย์ในแบบที่คุณเป็นจะสร้างค่าว่างสำหรับองค์ประกอบจำนวนมากในอาร์เรย์หรือโอเวอร์โฟลว์ที่เป็นไปได้ สมมติว่ามีข้อมูล 4 คอลัมน์และข้อมูล 5 แถวใน dgv_Input อาร์เรย์ string[50,50] จะมีลักษณะดังนี้ด้านล่างหลังจากที่คุณอ่านเซลล์ลงในอาร์เรย์เช่นเดียวกับโค้ด:

[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

นี่เป็นพื้นที่สิ้นเปลืองจำนวนมากอย่างชัดเจนและรับประกันค่าว่าง/สตริง เมื่อคุณพยายามเขียนอาร์เรย์นี้ลงในไฟล์ คุณควรตรวจสอบค่าว่างเหล่านี้ด้วย:

If (s != null)…

คุณอาจต้องการคิดใหม่ว่าคุณต้องการจัดเก็บสตริงจาก DataGridView อย่างไร… ฉันเดาว่าจะมี 1 สตริงสำหรับแต่ละแถวและอาจเก็บไว้ใน List เนื่องจากคุณอาจไม่รู้ว่ามีกี่สตริง

สำหรับปัญหาที่สองของคุณ ฉันเดาว่าปัญหาอยู่ที่บรรทัดโค้ดต่อไปนี้:

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

ฉันไม่คิดว่านี่จะคืนสิ่งที่คุณคาดหวัง ประการแรก มีความเป็นไปได้ที่ดีที่ dgv_Input.Rows[a].Cells[b].Value อาจเป็นโมฆะ ฉันทราบว่าบรรทัดดังกล่าวกำลังถามว่า STRING เป็นค่าว่าง IsNullOrEmpty หรือไม่ นอกจากนี้บรรทัดด้านบนจะคืนค่าเป็นจริงหากค่าในเซลล์ DataGridView เป็นตัวเลข กล่าวอีกนัยหนึ่ง ดูเหมือนว่าบรรทัดด้านบนจะไม่ทำงานตามที่คาดไว้ ด้านล่างนี้ ฉันแจกแจงโค้ดเพื่อตรวจสอบว่าค่าใดเป็นโมฆะหรือค่าใดเป็นสตริงว่าง ดูเหมือนว่าจะทำงานได้ตามที่คาดไว้

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
ตามวิธีที่ Tomato32 มอบให้ฉัน ฉันได้แก้ไขข้อผิดพลาดของปัญหาที่ 2 แล้ว แต่ฉันขอบคุณมากสำหรับความช่วยเหลือและความรู้ที่คุณแบ่งปัน ฉันแค่อยากจะบอกว่าขอบคุณ!! - person Thang Nguyen; 21.02.2017

คุณควรแก้ไขลูปดังต่อไปนี้ แล้วมันก็จะดำเนินไปตามปกตินะเพื่อน

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
ฉันไม่รู้ว่าทำไม แต่มันช่วยฉันแก้ปัญหาที่ 2 ของฉันได้ ขอบคุณมากพี่ชาย แต่ฉันคิดว่าวิธีนั้นใช้ไม่ได้กับปัญหาแรกของฉันเพราะใน DataGridview ของฉัน คอลัมน์สุดท้ายคือปุ่มและแถวสุดท้ายเป็นแถวว่าง ดังนั้นทำไมฉันถึงใช้ dgv_Input.Rows.Count - 1 และ dgv_Input.Columns.Count - 1 แทน dgv_Input.Rows.Count และ dgv_Input.Columns.Count - person Thang Nguyen; 21.02.2017
comment
คุณกำลังสร้างแอปพลิเคชันสำหรับมุมมองกริดที่แก้ไขได้ใช่ไหม จากนั้นเมื่อคลิกปุ่มแสดงการตรวจสอบความถูกต้อง? - person Tomato32; 21.02.2017
comment
เช่นเดียวกับที่ ความคิดของฉันคือถ้าฉันคลิกปุ่ม แถวจะถูกลบ แต่ฉันจะสร้างคุณลักษณะนั้นในภายหลัง ตอนนี้ฉันต้องหาวิธีเขียนค่าทั้งหมดของอาร์เรย์ Info_Goods ลงใน text.txt เพราะมันเขียนเพียง 1 องค์ประกอบของอาร์เรย์นั้น :(( sosad - person Thang Nguyen; 21.02.2017
comment
คุณใช้สไกป์เหรอ? เพียงเพิ่มนิคของฉัน manhtran32 บางทีฉันสามารถสนับสนุน :)) - 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 :)) Mà em không có máy nên chỉ ra quán code thôi anh ơi - person Thang Nguyen; 21.02.2017