0

小さなファイル エクスプローラー [ListView] から選択した項目の [プロパティ] フォームを作成しようとしています [
選択したファイル/フォルダーを右クリックして [プロパティ] を選択したときの Windows のように]。

フォームには、名前、場所、タイプ、サイズ、および属性が表示されます

[WCF サービス] サーバー クライアント アプリケーションなので、独自のスレッドで開始されるMultiというメソッドからサーバーから属性を取得します。

質問は次のとおりです。 [非表示] と [読み取り専用] の属性値が異なる複数のファイルの場合、CheckState.Indeterminate を設定するにはどうすればよいですか。

ここに画像の説明を入力

WCF_Client.FM_ServiceReference.FileManagerClient client;

private void Form_MultiProp_Load(object sender, EventArgs e)
    {
        Thread th = new Thread(Multi);
        th.Start();
    }

private void GetAttributes(FileAttributes fAttributes)
    {
        this.Invoke((MethodInvoker)delegate
        {
            if (fAttributes != 0)
            {
                if ((fAttributes & FileAttributes.Hidden) == FileAttributes.Hidden)
                    Hidden.Checked = true;
                if ((fAttributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                    ReadOnly.Checked = true;
            }
        });
    }

    public void Multi()
    {
        foreach (Item item in itemCollection)
        {
            GetAttributes(client.GetAttributeOfPath(item.Path));
        }
    }
4

2 に答える 2

0

最初のファイルに[非表示]チェックボックスと[読み取り専用]チェックボックスを設定してから、別の属性を持つファイルが見つかった場合は、これらを[不確定]に設定する必要があります。

private void GetAttributes(FileAttributes fAttributes)
{
    this.Invoke((MethodInvoker)delegate
    {
        if (fAttributes != 0)
        {
            bool hidden = (fAttributes & FileAttributes.Hidden) == FileAttributes.Hidden;
            if (Hidden.Checked != hidden)
                Hidden.CheckState = CheckState.Indeterminate;
            bool readOnly = (fAttributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly;
            if (ReadOnly.Checked != readOnly)
                ReadOnly.CheckState = CheckState.Indeterminate;
        }
    });
}

public void Multi()
{
    FileAttributes fAttributes = client.GetAttributeOfPath(item[0].Path)
    this.Invoke((MethodInvoker)delegate
    {
        if (fAttributes != 0)
        {
            Hidden.Checked = (fAttributes & FileAttributes.Hidden) == FileAttributes.Hidden;
            ReadOnly.Checked = (fAttributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly;
        }
    });
    for (int i = 1; i < itemCollection.Count; i++)
    {
        Item item = itemCollection[i];
        GetAttributes(client.GetAttributeOfPath(item.Path));
    }
}
于 2012-04-16T07:51:10.857 に答える
0

すべての属性をリストに追加し、ReadonlyCheckBox と HiddenCheckBox の CheckState を決定する Checking メソッドを呼び出しました。Checkingメソッドは、CheckState を設定するかどうかをチェックprev attribute == next attributeします。

List<FileAttributes> listAttributes = new List<FileAttributes>();

private void HiddenInvoke(CheckState HiddenState)
    {
        this.Invoke((MethodInvoker)delegate
        {
            Hidden.CheckState = HiddenState;
        });
    }
    private void ReadOnlyInvoke(CheckState ReadOnlyState)
    {
        this.Invoke((MethodInvoker)delegate
        {
            ReadOnly.CheckState = ReadOnlyState;
        });
    }
    private void HiddenCheck(bool check)
    {
        this.Invoke((MethodInvoker)delegate
        {
            Hidden.Checked = check;
        });
    }
    private void ReadOnlyCheck(bool check)
    {
        this.Invoke((MethodInvoker)delegate
        {
            ReadOnly.Checked = check;
        });
    }

public void Multi()
    {
        try
        {
            long SizeAll = 0;
            int fileCount = 0, folderCount = 0;
            LocInvoke(Loc);
            foreach (ListViewItem item in SelectedItems)
            {
               // some other calculations..
                if (client.IsFile(item.ToolTipText))
                    TypeInvoke(++fileCount, folderCount);
                else if (client.IsFolder(item.ToolTipText))
                    TypeInvoke(fileCount, ++folderCount);
               // Adding Attributes to a list
                listAttributes.Add(client.GetAttributeOfPath(item.ToolTipText));
               //Size Calculation
                SizeInvoke(CnvrtUnit(SizeAll += client.GetSizeOfPath(item.ToolTipText)));
            }
            Checking();
            Finished("OK", true);
        }
        catch { } //in case user closes the form before it finishes
    }

private void Checking()
    {
        bool hiddenSet = false;
        bool readonlySet = false;
        for (int i = 1; i < listAttributes.Count; i++)
        {
            if (hiddenSet && readonlySet)   //checks if they already different then there's no need to check again
                return;
            if (!hiddenSet)
            {
                if ((listAttributes[i - 1] & FileAttributes.Hidden) == (listAttributes[i] & FileAttributes.Hidden))
                {
                    HiddenCheck((listAttributes[i] & FileAttributes.Hidden) == FileAttributes.Hidden);
                }
                else
                {
                    HiddenInvoke(CheckState.Indeterminate);
                    hiddenSet = true;
                }
            }
            if (!readonlySet)
            {
                if ((listAttributes[i - 1] & FileAttributes.ReadOnly) == (listAttributes[i] & FileAttributes.ReadOnly))
                {
                    ReadOnlyCheck((listAttributes[i] & FileAttributes.ReadOnly) == FileAttributes.ReadOnly);
                }
                else
                {
                    ReadOnlyInvoke(CheckState.Indeterminate);
                    readonlySet = true;
                }
            }
        }
    }

ここに画像の説明を入力

于 2012-04-16T08:20:10.000 に答える