2016-06-15 48 views
0

請允許我澄清我的情況和方法。C# - 我如何分別從每個無線電GroupBox返回int值?

我有一個excel文件10列。前五列包含形成查詢條件的數據,而最後五列包含形成結果的數據。

我試圖與這個數據的軟件在數據庫中或excel (如果數據庫是困難的),其中前五個欄將在五個不同的鏈接 到列表或菜單或目前的RadioButtons組。 進行選擇並按下SUBMIT按鈕時,結果 將顯示爲來自excel或 數據庫中匹配行的五個數據。

這就是我想要實現的。

如果我的方法錯誤,請發表評論。在此先感謝所有帖子。

-------------------------- Original Question ------------------ ----------

我有5個groupboxes(1有5個單選按鈕,2有3,3和4有11,5有4)在WPF上。 基於從每個groupBox中選擇哪個單選按鈕,軟件預計會給出四個參數輸出(來自CSV或數據庫)

我已經使用了How do I get which radio button is checked from a groupbox?這個由King給出的代碼,並將其修改爲使用爲我的目的。

var checkedRadio = new []{groupBox1, groupBox2, groupBox3, groupBox4, groupBox5}.SelectMany(g=>g.Controls.OfType<RadioButton>().Where(r=>r.Checked)); 
foreach(var c in checkedRadio) 
    MessageBox.Show(c.Name); 

這給了我一個接一個選擇的單選按鈕作爲消息框。

我要感謝King King和其他許多人(超過20人),他們的答案爲各種答案幫助我達到了這一點。

我被卡住的地方是如何使用foreach循環將值賦給五個單獨的int,然後用它來計算最終的int值,我可以將它分配給我想要顯示的各種結果。

我試圖在每個CheckedChanged事件處理程序中爲int賦值,但它們都是private void並且不返回任何內容。我試圖改變他們返回整數,但我似乎無法破解這個堅果。

我相信我的整個方法在這裏可能是錯的,但我對此沒有太多的想法。

//我基本上想要的是給出g = 5個組中的選項,並基於這五個組中的選擇(excel中的列),顯示數據庫中匹配行中4個相應列的結果。上面我目前的做法是一種解決方法,因爲我沒有用databases.//

回答

0

我想你應該省略分配值五株分離int s工作的知識,但計算結果值。例如,讓我們由位編碼groupBox S,並計算位掩碼

groupBox1 - 00001 (let it be checked) 
    groupBox2 - 00010 
    groupBox3 - 00100 (let it be checked) 
    groupBox4 - 01000 (let it be checked) 
    groupBox5 - 10000 
    ----------------- 
    mask  01101 (13) 

所以如果groupBox1groupBox3groupBox4檢查最後的面具將01101

var result = new [] {groupBox1, groupBox2, groupBox3, groupBox4, groupBox5} 
    .Select((box, index) => new { 
    box = box, 
    mask = 1 << index 
    }) 
    .Where(item => item.box.Controls 
    .OfType<RadioButton>() 
    .Any(button => button.Checked)) 
    .Sum(item => item.mask); 

萬一你必須用任意砝碼整理成集合例如,陣列

double[] weights = new double[] {1.2, 3.58, 4.62, -1.7, 0.9}; 

    double result = new [] {groupBox1, groupBox2, groupBox3, groupBox4, groupBox5} 
    .Select((box, index) => new { 
     box = box, 
     weight = weights[index] 
    } 
    .Where(item => item.box.Controls 
     .OfType<RadioButton>() 
     .Any(button => button.Checked)) 
    .Sum(item => item.weight); 

的指導原則仍然是相同的:不使用分隔值:因爲你有收集對於對照(groupboxes),把對應的值代入一個收集,以及

+0

這是有道理的。我非常感謝您的意見。情況是,每個組框中必須有一個選擇,我需要知道每個選擇。爲此,將爲每個幫助添加一個唯一的int?因爲否則,選擇不會幫助我縮小到單個單選按鈕。 –

0

對不起,但這是醜陋的分開收藏。您應該根據具有int的複選框創建用戶控件,或者使用控件的標記。您可以將組框作爲一個控件,將計算抽象爲表單,但這取決於您對它們做了什麼。

public class MyClass : CheckBox 
{ 
    public int MyValue { get; set; } 

    public MyClass() 
    { 

    } 
} 

或者只是使用:

value = (int)myCheckBox.Tag; 
+0

感謝您的回覆。這非常有幫助。我理解多重收藏的問題,但是我的選擇是爲了將類似選項聚合在一起的美觀原因。讓我試試否則。 –