スタートの代わりに。
最近、仕事用のアプリケーションを作成する必要がありました。 以前は、私はPHPとWebマズルのみを使用していましたが、フォームやその他の「パセリ」を使用して、承認された本格的なWindowsアプリケーションを作成する必要がありました。 この記事は、マナをアクセス可能かつシンプルにすることを目的とした抽象的な抽象的な例で書いています。 実際、ここでは、アプリケーション自体ではなく、行動方針が重要です。
タスクは、Webインターフェイスなしでサーバーから受信した表形式のデータを操作することでした。 利用可能なツール:Apache + PHP + MySQL WebサーバーおよびC#クライアント側アプリケーション。
専門家が興味を持つことはまずありません。 しかし、初心者にとっては、それは重宝するかもしれません。 私は、アイデアの具体化でそれをやり過ぎないことを本当に望みます。
バンドルの実装を気にする人-catの下でお願いします。
最初に、サーバーとのデータ交換を提供するコードの一部について説明するとともに、送受信されるメッセージの文字列を操作します。
既製のクラスに実装しましたが、ここではすべてのクラスのリスト全体ではなく、必要なメソッドのみを提供します。
私の記憶では、クライアントはC#で書かれています。 私たちのオフィスではWindows Formsの標準バージョンをより好むため、WPFを放棄しなければなりませんでした。 サーバーサイドはPHPで作成されました。MonoCompleteで本格的なCGIクライアントを記述するよりも高速であることが判明したためです。
これは、VisualStudio(VS2013とReSharperを使用)およびC#での初めての経験です。 したがって、どこかでそれをより便利にすることができたなら、厳密に判断しないでください-私は喜んでコメントを読んで、私の将来の発展でそれらを検討します。
データ暗号化
さまざまなプラットフォームでの汎用性のため、基本形式はBase-64です。
// Base64 public static string Base64Encode(string inputString) { return Convert.ToBase64String(Encoding.UTF8.GetBytes(inputString)); }
// Base64 public static string Base64Decode(string inputString) { return Encoding.UTF8.GetString(Convert.FromBase64String(inputString)); }
サーバーリクエスト
動作するには、ライブラリ「 Newtonsoft.Json 」が必要です。 それをプロジェクトの参照に追加します。そうしないと機能しません。 サーバーがDebian Squeezeを実行しており、すべての場所でUTF-8エンコードを使用していることにすぐに注意します。 したがって、コードは互換性のための行を提供します。 グアに夢中になる人はいません。 このようなコードにコメントする意味はありません-明らかです。
public static Dictionary<string, string> Response(string handlerString, string inputString = "") { try { // var requestString = (inputString.Length > 0) ? "handler=" + handlerString + "&args=" + Base64Encode(inputString) : "handler=" + handlerString; // HttpWebRequest. , - , . // * Properties.Settings.Default , , , IMHO. , . // Properties.Settings.Default.handlerUri = (string) "http://__/handler.php" var request = (HttpWebRequest) WebRequest.Create(Properties.Settings.Default.handlerUri); // Properties.Settings.Default.httpMethod = (string) "POST" request.Method = Properties.Settings.Default.httpMethod; request.Credentials = CredentialCache.DefaultCredentials; var encoding = new UTF8Encoding(); var bytes = encoding.GetBytes(requestString); // Properties.Settings.Default.httpContentType = (string) "application/x-www-form-urlencoded" request.ContentType = Properties.Settings.Default.httpContentType; request.ContentLength = bytes.Length; using (var newStream = request.GetRequestStream()) { newStream.Write(bytes, 0, bytes.Length); newStream.Close(); } var response = (HttpWebResponse) request.GetResponse(); var streamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); var responseString = streamReader.ReadToEnd().Trim(); // JSON-, Base-64 . ... , .Trim('"'). , . return JsonConvert.DeserializeObject<Dictionary<string, string>>( Base64Decode(responseString.Trim('"'))); } catch (Exception exception) { // , - . // Properties.Settings.Default.errorMessageServerHandlerBug = (string) ", . .". // Properties.Settings.Default.msgboxCaptionError = (string) "". MessageBox.Show( Properties.Settings.Default.errorMessageServerHandlerBug + Convert.ToChar("\n") + exception.Message, Properties.Settings.Default.msgboxCaptionError, MessageBoxButtons.OK, MessageBoxIcon.Error); // , - , .. . Application.Exit(); // , VS return', . , , :) return JsonConvert.DeserializeObject<Dictionary<string, string>>("{\"type\":\"error\",\"data\":\"-1\"}"); } }
それでは、記事のメイントピックに移りましょう。
テーブルのフィールド(列見出し)は次のようになります。
- Id
- 役職
- 電話番号
- メール
- メッセンジャー
まず、PHP(サーバー側)の一部について説明します。
define("DB_HOST", "localhost"); define("DB_USER", "__"); define("DB_PASS", "__"); define("DB_NAME", "___"); define("DB_CHARSET", "utf8"); define("ANSWER_SUCCESS", "success"); define("ANSWER_ERROR", "error"); function make_answer($type, $data) { print base64_encode(json_encode([ "type" => $type, "data" => $data ])); exit();// . } $db = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASS); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->exec("SET NAMES '".DB_CHARSET."'"); $query = $db->query("SELECT `Id`,`Title`,`PhoneNumber`,`Email`,`Messengers` FROM `contacts` WHERE 1"); $query->execute(); $query->setFetchMode(PDO::FETCH_ASSOC); $result = []; while ($current = $query->fetch()) { $result[] = [ "Id" => base64_encode($current["Id"]), "Title" => base64_encode($current["Title"]), "PhoneNumber" => base64_encode($current["PhoneNumber"]), "Email" => base64_encode($current["Email"]), "Messengers" => base64_encode($current["Messengers"]) ]; } if (count($result) > 0) { make_answer(ANSWER_SUCCESS, $result); } make_answer(ANSWER_ERROR, " ");
一般的に言えば。 ここで、データベースに接続し、必要なデータを取得して(PDOを使用)、配列の形式で応答を作成します。 エントリがない場合は、エラーメッセージを返します。
データ配列の形式は次のとおりです。
配列[
0 =>配列[「Id」=>「値」、「タイトル」=>「値」、「電話番号」=>「値」、「メール」=>「値」、「メッセンジャー」=>「値」] 、
1 =>配列[「Id」=>「値」、「タイトル」=>「値」、「電話番号」=>「値」、「メール」=>「値」、「メッセンジャー」=>「値」] 、
...
N =>配列[「Id」=>「値」、「タイトル」=>「値」、「電話番号」=>「値」、「メール」=>「値」、「メッセンジャー」=>「値」]
]
将来的には、このフォームは、データベースおよび「キー値」タイプの2次元データのセットを操作するのに最も便利であると考えています。
データはHTTPプロトコルを使用して交換されるため、受信したデータを画面に表示してスクリプトを完了するだけで十分です。
各フィールドの値はBase-64形式でエンコードされ、データ配列全体がJSON形式に変換され、再びBase-64でエンコードされます。 アプリケーションのクライアント部分で解析するのに十分安全で便利です。
次に、クライアント側を分析します。
dataSetとdataGridViewコンポーネントの組み合わせを使用しました。
フォームには2つのコンポーネント(初心者向け)があります:dataSetContactsTable、dataGridViewContactsTable。
すぐにすべてのコンポーネントに明確な名前を付けることをお勧めします。そうしないと、コードの混乱が始まり、リファクタリングするよりもソフトウェアを書き直す方が簡単になります。
dataSetコンポーネントを追加するときに、オプション「Untyped data set」を選択しました。
ここで、dataSetコンポーネントを構成します。 プロパティで設定します:
- 名前= dataSetContactsTable
- DataSetName = DataSetContactsTable
- テーブル= (作成されたテキストについては以下を参照)
[追加]ボタンをクリックして、作成したテーブルを構成します。 設定したオプションは次のとおりです。
- 列= (すぐ下の列について説明します)
- TableName = TableContactsView
- 名前= dataTableContactsView
- 修飾子=パブリック
表の列は、サーバーから到着するデータに対応する必要があります。 したがって、次のように行われました。
- (ID-キャプション-ColumnName-読み取り専用-名前)
- 0-ID-ColumnId-true-dataColumnId
- 1-連絡先-ColumnTitle-true-dataColumnTitle
- 2-電話-ColumnPhoneNumber-true-dataColumnPhoneNumber
- 3-電子メール-ColumnEmail-true-dataColumnEmail
- 4-トーカー-ColumnMessengers-true-dataColumnMessengers
すべての列が読み取り専用に設定されているのはなぜかと思うかもしれません。 これは、行をダブルクリックすると、選択したレコードの処理が実行される別のウィンドウが表示されるソフトインクの機能によるものです。
dataGridコンポーネントのセットアップに移りましょう。 そして最初に、私が彼のために行ったプロパティの変更について説明します。
どうやら、構成の設計部分を説明する意味はありません-それぞれが独自のものを持つことができます。 列とdataSetコンポーネントへのバインドの問題のみを扱います。
- DataMember = TableContactsView
- DataSource = dataSetContactsTable
- 列= (テキストについては以下を参照)
レコードIDを除くテーブルのすべてのフィールドは、アプリケーションユーザーに表示する必要があります。 したがって、Idフィールドは、VisibleパラメーターがFalseに設定されている唯一のフィールドです。 それ以外の場合、設定は似ています。
- HeaderText-DataPropertyName
- Id-ColumnUserId
- 連絡先-ColumnTitle
- 電話-ColumnPhoneNumber
- メール-ColumnEmail
- トーカー-ColumnMessengers
それだけです マウスが完成したら、コードに移動できます。
private void FormContacts_Load(object sender, EventArgs e) { LoadContactsTable(); }
さらに作業を進めるために、サーバーから到着するJSON配列の解析に役立つクラスをすぐに作成します。
public class ContactsList { public string Id { get; set; } public string Title { get; set; } public string PhoneNumber { get; set; } public string Email { get; set; } public string Messengers { get; set; } }
次に、データを削除してフォーム上のテーブルに再ロードするメソッドを作成する必要があります(FormContacts_Loadのコードで既に説明しました)。
// , , - . . public void LoadContactsTable(string args = "") { // , .. // , - . dataTableContactsView.Clear(); // var contactsResponse = Response("getContactsTable", args); // , - if (contactsResponse["type"].Trim() == "success") { // ContactsList, var contactsJsonList = (List<ContactsList>) JsonConvert.DeserializeObject(contactsResponse["data"].Trim(), typeof (List<ContactsList>)); foreach (var key in contactsJsonList) { // var row = dataTableContactsView.NewRow(); row[0] = Base64Decode(key.Id); row[1] = Base64Decode(key.Title); row[2] = Base64Decode(key.PhoneNumber); row[3] = Base64Decode(key.Email); row[4] = Base64Decode(key.Messengers); dataTableContactsView.Rows.Add(row); } } // , , else { MessageBox.Show(contactsResponse["data"].Trim(), @"", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
それは基本的にそれです。 すべての成功条件(サーバーがあり、要求のハンドラーが書き込まれ、サーバーからの応答があり、データベースにデータがある)の下で、必要なデータがフォームに表示されます。
同様の原則により、他のテーブルアプリケーションを構築できます。 すべてがそうです。 私が何かを説明するのを忘れていないこと、そして説明されている資料がかなりアクセス可能で簡単であることを願っています。
ご清聴ありがとうございました。