0

ListView新しいウィンドウで作成し、WPF呼び出されたときに ListView を設定する関数も作成しました。この関数は、データを保存した Web サーバーの URL を取得し、「id」をインクリメントしてデータを取得し、ListView に保存します。したがって、ListView に特定の数のアイテムを設定します。

私が直面している問題は、各 ListView 項目にプログラムで入力されるときに、ON と OFF の 2 つのボタンを追加したいということです。つまり、16 個のアイテムを追加する場合は、各アイテムに 2 つのボタンが必要であり、12 個のアイテムの場合は同様の手順が必要です。これが私のコードです:

namespace user_login
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>

    public partial class MainWindow : Window
    {
        Window1 W = new Window1();

        public MainWindow()
        {
            InitializeComponent();    
        }

        public void populate()
        {
            int i;
            int num = 16;

            for (i = 1; i <= num; i++)
            {
                string val = Convert.ToString(i);
                string currentUrl = "http://xpleria.com/devices.php?query=dev&id=";
                string newUrlWithChangedSort = ReplaceQueryStringParam(currentUrl, "id", val);
                string result = getcontent(newUrlWithChangedSort);    
                W.list1.Items.Add(result);
            }
        }

        public string getcontent(string URL)
        {
            string content = "";

            // Get HTML data
            WebClient client = new WebClient();

            try
            {
                content = client.DownloadString(URL);
            }
            catch (Exception)
            {
                System.Windows.Forms.MessageBox.Show("No Connection detected!!!");
            }
            return content;
        }

        public static string ReplaceQueryStringParam(string currentPageUrl, string paramToReplace, string newValue)
        {
            string urlWithoutQuery = currentPageUrl.IndexOf('?') >= 0
                ? currentPageUrl.Substring(0, currentPageUrl.IndexOf('?'))
                : currentPageUrl;

            string queryString = currentPageUrl.IndexOf('?') >= 0
                ? currentPageUrl.Substring(currentPageUrl.IndexOf('?'))
                : null;

            var queryParamList = queryString != null
                ? HttpUtility.ParseQueryString(queryString)
                : HttpUtility.ParseQueryString(string.Empty);

            if (queryParamList[paramToReplace] != null)
            {
                queryParamList[paramToReplace] = newValue;
            }
            else
            {
                queryParamList.Add(paramToReplace, newValue);
            }

            return String.Format("{0}?{1}", urlWithoutQuery, queryParamList);
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            string user = textbox1.Text;
            string password = textbox2.Password;
            string currentUrl = "http://xpleria.com/login.php?query=login&user=wcam&pass=wireless";
            string newUrlWithChangedSort = ReplaceQueryStringParam(currentUrl, "user", user);
            string newUrl = newUrlWithChangedSort;
            string FinalUrl = ReplaceQueryStringParam(newUrl, "pass", password);
            string result= getcontent(FinalUrl);
            string value = result.Substring(0, 8);

            string invalid = "xpleria0";
            string valid = "xpleria1";

            if (value.Equals(invalid))
            {
                System.Windows.MessageBox.Show("The Username and/or Password you have entered is invalid, please try again");
            }
            else if (value.Equals(valid))
            {
                string sessionID = result.Substring(8, 32);
                System.Windows.MessageBox.Show("HI, WELCOME CLETA");
                this.Close();

                using (new user_login.loading.PleaseWait(this.Location))
                {
                    W.Show();
                    populate();
                }
            }
        }

        public System.Drawing.Point Location { get; set; }
    }
}
4

1 に答える 1

1

一歩下がって、コードの整理を真剣に検討することをお勧めします。これはあなたが尋ねた質問に対する答えではありませんが、あなたが尋ねるべき質問に対する答えです.

まず、URL からのこれらのアイテムの取得に関連するすべてのコードを、何らかのクラスに移動する必要があります。このクラスは、コンストラクタ パラメータとして URL 文字列を受け入れ、適切なデータをすべて収集する必要があります。次に、個々のアイテムごとにデータを入力するために使用する別のクラスを作成し、このリストを公開する必要があります。完了するまでに、ウィンドウ内のコードは次のように少し複雑になっているはずです。

var ItemsGetter = new ItemsGetter(URL);
foreach(var Item in ItemsGetter.Items)
{
    // Populate the ListView
}

それが完了したら、UserControl を作成することをお勧めします。ユーザー コントロールは、動的な数のデータ エンティティを、それぞれに対して操作を実行できる独自のコントロール セットで表す必要がある場合に非常に役立ちます。ラベルと必要な 2 つのボタンを使用して UserControl を作成する必要があります。UserControl のコンストラクターは、各クラスを表すために作成したデータ型のパラメーターを想定する必要があります。そこから、必要に応じてデータ型でボタンを操作できます。

最後に、おそらく UserControl を Window と対話させる方法が必要になるでしょう。たとえば、ボタンの 1 つが「削除」であるとします。操作が完了したら、項目をリストから消したいと思うでしょう。コントロールをパラメーターなどとして渡して、ウィンドウと結び付けようとしないでください。代わりに、イベントを読んでAction、リスト ビューに入力するときに Window の foreach ループにバインドするユーザー コントロールでイベントを作成する方法を学びます。UserControl がボタンによってトリガーされた削除操作を完了すると、UserControl のイベントを発生させることができます。このイベントは、ウィンドウにリスト ビューからコントロールを削除するように促します。

最後になりましたが、コントロールに名前を付けてください。

うまくいけば、これが役に立ちます。

于 2013-05-15T04:37:57.807 に答える