Hướng dẫn lập trình chương trình TRA ĐIỂM MỞ

Hướng dẫn lập trình chương trình TRA ĐIỂM MỞ

Xem Giới thiệu chương trình tra điểm mở 

1. Chuẩn bị giao diện:

1 TextBox để người dùng nhập vào các mã số sinh viên , có thể để multiline, thêm vào Text mặc định.

1 Button để thực hiện lệnh download html

1 ListBox để show các mã số sinh viên đang có trong dữ liệu của mình lên

1 Button để thực hiện lệnh xem từng bảng điểm

1 WebBrowser để có thể hiển thị được html như các Web Browser

Ta có thể có giao diện như sau:

clip_image002

2. Danh sách công việc:

a. Lập trình sau khi nhấn Button Tải xuống thì chương trình lấy các mã số sinh viên trong TextBox để download các trang html với mã số tương ứng về máy.

Ta dùng 1 mảng String để chứa danh sách mã số sinh viên từ dòng Text của TextBox . Mỗi mã số sinh viên trong dòng Text ta quy định cho người dùng nhập vào theo cú pháp “cách nhau 1 dấu chấm phẩy (‘;’)” . Vì vậy, ta sẽ dùng phương thức tách chuỗi (Split) để xử lý:

string day_MSSV = textBox1.Text;
string[] ds_MSSV = day_MSSV.Split(';');

Bây giờ để có thể lấy source html của 1 trang web theo giao thức HTTP thì ta sẽ dùng lớp: HttpWebRequest (yêu cầu) và HttpWebResponse (phản hồi) thuộc System.Net .

Tạo và gửi yêu cầu đến trang web có URL là biến url

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

Sau đó nhận phản hồi từ yêu cầu mới gửi đi

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Tiếp theo là sẽ tạo luồng đọc phản hồi mới nhận đó bằng luồng hiểu UTF8

StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);

Vậy là ta có thể tiếp tục đọc dữ liệu như khi thao tác trên File

Ví dụ như ta có thể đọc hết toàn bộ rồi lưu vào 1 biến String

String html = reader.ReadToEnd();

Và sau khi đọc xong, đừng quên:

reader.Close();
response.Close();

Ta có thể xây dựng 1 hàm trả về 1 String chứa toàn bộ source html của trang web với URL là tham số đầu vào của hàm:

string GetHtmlFromUrl(string url)
{
string htmlsource=””;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
htmlsource = reader.ReadToEnd();

reader.Close();
response.Close();

return htmlsource;
}

Thay vì lấy hết toàn bộ source HTML thì ta cũng có thể chọn lọc những dữ liệu cần thiết bằng cách xét từng dòng.

Việc tiếp theo là làm sao ứng với mỗi mã số sinh viên có thể tìm đến trang web bảng điểm tương ứng. 1 cách đơn giản, ta hãy quan sát 2 URL sau ứng với web có bảng điểm của 2 mã số sinh viên: 0951010054 và 40763765

http://dichvu.ou.edu.vn/edunet/modules.php?name=diemthi&act=xl_xemdiemthi&txt_masosinhvien=0951010054&cbo_view=1&cmd=Xem+%C4%91i%E1%BB%83m+%C2%BB

http://dichvu.ou.edu.vn/edunet/modules.php?name=diemthi&act=xl_xemdiemthi&txt_masosinhvien=40763765&cbo_view=1&cmd=Xem+%C4%91i%E1%BB%83m+%C2%BB

Và rút ra URL sẽ có dạng: http://dichvu….……&txt masosinhvien=X&cbo view=………… sẽ tới được trang web coi điểm của mã số sinh viên X

Vậy ta chỉ việc lần lượt duyệt qua các mã số trong danh sách mã số sinh viên mà ta đã Split , mỗi mã số như vậy ta sẽ cho kết hợp với chuỗi http://dichvu….……&txt masosinhvien= &cbo view=………… sẽ được URL đến trang web tương ứng.

string sourceBegin = "http://dichvu.ou.edu.vn/edunet/modules.php?name=diemthi&act=xl_xemdiemthi&txt_masosinhvien=";
string sourceEnd = "&cbo_view=1&cmd=Xem+%C4%91i%E1%BB%83m+%C2%BB";
for (int i = 0; i < ds_MSSV.Length; i++)
{
string url = sourceBegin + ds_MSSV[i] + sourceEnd;
string html = GetHtmlFromUrl(url);

//-----------------------------------
//ghi chuỗi html vào file
//-----------------------------------
}

Ghi dữ liệu vào file nhưng lưu dưới dạng .htm với tên file là tên mssv cũng giống như việc tạo file txt. Ta có thể làm như sau:

FileStream aFile = new FileStream(ds_MSSV[i] + ".htm", FileMode.Create);
StreamWriter sw = new StreamWriter(aFile);
sw.Write(html);
sw.Close();
aFile.Close();

File .htm sẽ được tạo cùng địa chỉ với chương trình .exe của mình. Bây giờ, nếu muốn đưa đống file đó vào trong 1 thư mục cùng địa chỉ để ta dễ quản lý thì ta sẽ phải tìm cách tạo folder khi chưa có .

       void CreateFolder(string strPath)
        {
            try
            {
                if (Directory.Exists(strPath) == false)
                {
                    Directory.CreateDirectory(strPath);
                }
            }
            catch { }
        }

Ta sẽ gọi hàm này trong sự kiện FormLoad . Ví dụ tạo folder với tên: DataSource

CreateFolder(“DataSource”)

Sau đó mình sửa lại đoạn code tạo file vì lúc này ta sẽ bỏ vào folder

FileStream aFile = new FileStream("DataSource/" + ds_MSSV[i] + ".htm", FileMode.Create);

Lưu ý: để chắc ăn hơn ở vị trí tạo file, lưu file, ta có thể dùng Directory.GetCurrentDirectory() để lấy đường dẫn hiện thời của chương trình

Vậy là xong công đoạn Download trang web

b. Show các mã số sinh viên đang có của mình lên ListBox

Đầu tiên mình sẽ xóa hết phần tử trong ListBox. Sau đó mình sẽ lấy tên tất cả các File . Nhưng khi dùng phương thức Directory.GetFiles thì sẽ lấy luôn có đường dẫn và đuôi mở rộng nên ta sẽ phải xử lý để chỉ lấy phần mã số và Add vào ListBox. Ví dụ:

void LoadFile()
{
listBox1.Items.Clear();
string[] a = Directory.GetFiles(duongdan + "/DataSource/", "*.htm");
for (int i = 0; i < a.Length; i++)
{
int filestart = a[i].LastIndexOf('/') + 1;
int fileend = a[i].LastIndexOf('.');
   string sub = a[i].Substring(filestart, fileend - filestart);
   listBox1.Items.Add(sub);
}
}

c. Show trang web lên WebBrowser

Cũng khá đơn giản. Ta tạo 1 URI bằng 1 chuỗi kí tự đại diện cho URL. Do đó phải có giao thức, và để mở file trong ổ đĩa địa phương, ta sẽ dùng giao thức file.

System.Uri uri = new Uri("file:///" + duongdan + "/DataSource/" + listBox1.SelectedItem.ToString() + ".htm");

Kế đến, ta sẽ gán URI mới tạo cho thuộc tính Url của webBrowser là webBrowser sẽ hiển thị trang có tên ứng với mã số sinh viên được chọn trong ListBox

webBrowser1.Url = uri;

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s