2012-12-05 1 views
0

. 첫 번째 열은 ComboBox입니다. 즉, Gtk.CellRendererCombo를 사용합니다. 사실, ComboBox에서 값을 선택하면 셀의 Text를 방금 선택한 값으로 변경하고 싶습니다. Gtk.CellRendererCombo.Edited 이벤트에서 Text 필드 열을 EditedArgs.NewText로 설정하면 가능합니다.GTK CellRendererCombo 설정 값 나는 그것을 여러 열을 가지고 트 리뷰를 할 노력하고있어 무엇

문제는 값을 설정할 때마다 새 행을 만들고 Gtk.CellRendererText 에서처럼 텍스트 필드를 작동 시키려고하지만 문제가되지 않습니다. 그것은 Gtk.CellRendererCombo.Text에 걸렸고으로 해당 열에서 각 행에 대해 다른 값,하지만 같은 값 아니다

Gtk.CellRenderer 어떤 상태를 포함 할 수 없습니다

, 그래서 OK, 텍스트 필드를 사용하는 것은 정말 나쁜 내가하려는 일에서 나온 아이디어.

그러나 Gtk.ListStore에서 Gtk.CellRendererCombo의 모델과 다른 TreeView의 모델 인 값을 설정하면됩니다. 설정된 값은 ComboBox의 열에 표시되지 않습니다.

class Program 
{ 
    private static Gtk.TreeView treeview = null; 

    static void OnEdited(object sender, Gtk.EditedArgs args) 
    { 
     Gtk.TreeSelection selection = treeview.Selection; 
     Gtk.TreeIter iter; 
     selection.GetSelected(out iter); 

     treeview.Model.SetValue(iter, 0, args.NewText); // the CellRendererCombo 
     treeview.Model.SetValue(iter, 1, args.NewText); // the CellRendererText 

     //(sender as Gtk.CellRendererCombo).Text = args.NewText; // Will set all the Cells of this Column to the Selection's Text 
    } 

    static void Main(string[] args) 
    { 
     Gtk.Application.Init(); 

     Gtk.Window window = new Window("TreeView ComboTest"); 
     window.WidthRequest = 200; 
     window.HeightRequest = 150; 

     Gtk.ListStore treeModel = new ListStore(typeof(string), typeof(string)); 
     treeview = new TreeView(treeModel); 

     // Values to be chosen in the ComboBox 
     Gtk.ListStore comboModel = new ListStore(typeof(string)); 
     Gtk.ComboBox comboBox = new ComboBox(comboModel); 
     comboBox.AppendText("<Please select>"); 
     comboBox.AppendText("A"); 
     comboBox.AppendText("B"); 
     comboBox.AppendText("C"); 
     comboBox.Active = 0; 

     Gtk.TreeViewColumn comboCol = new TreeViewColumn(); 
     Gtk.CellRendererCombo comboCell = new CellRendererCombo(); 
     comboCol.Title = "Combo Column"; 
     comboCol.PackStart(comboCell, true); 
     comboCell.Editable = true; 
     comboCell.Edited += OnEdited; 
     comboCell.TextColumn = 0; 
     comboCell.Text = comboBox.ActiveText; 
     comboCell.Model = comboModel; 
     comboCell.WidthChars = 20; 

     Gtk.TreeViewColumn valueCol = new TreeViewColumn(); 
     Gtk.CellRendererText valueCell = new CellRendererText(); 
     valueCol.Title = "Value"; 
     valueCol.PackStart(valueCell, true); 
     valueCol.AddAttribute(valueCell, "text", 1); 

     treeview.AppendColumn(comboCol); 
     treeview.AppendColumn(valueCol); 

     // Append the values used for the tests 
     treeModel.AppendValues("comboBox1", string.Empty); // the string value setted for the first column does not appear. 
     treeModel.AppendValues("comboBox2", string.Empty); 
     treeModel.AppendValues("comboBox3", string.Empty); 

     window.Add(treeview); 
     window.ShowAll(); 
     Gtk.Application.Run(); 
    } 
} 

나는 선택이 값을 표시하게되어있는 콤보 상자의 셀을 좋아하지만, 나중에 변경 편집 할 수 계속할 것입니다.

누군가가이 일을하는 방법이 있다면, 난 당신이 입력에 매우 감사하게 될 것입니다. 감사.

는 업데이트 : Gtk.CellRendererCombo이 Gtk.CellRendererText에서 상속 때문에 내가 무슨 생각

, 그냥 셀에 걸렸고 값을 무시합니다. 지금, 나는 내가 렌더링에 제공 할 때 셀에 걸렸고 값을 Gtk.CellRendererCombo에서 상속 및 사용 사용자 정의 MyCellRendererCombo을 만들 수도 있겠죠,하지만 Gtk.CellRendererText 및 Gtk.CellRendererCombo의 차이에 대한 설명서는 아주 슬림 ... 나는 세부 사항을 알기 위해 C에서 구현을 방문해야한다고 생각한다.

답변

0

좋아, 내 문제에 대한 해결책을 발견했습니다, 나는 "텍스트"값을 읽을 수있는 "숨겨진"열을 사용합니다. 숨겨진 열에는 Gtk.CellRendererText가 포함되고 Gtk.CellRendererCombo에는 새 열에 특성 매핑이 있어야합니다.

결과 코드는 다음과 같습니다 :

class Program 
{ 
    private static Gtk.TreeView treeview = null; 

    static void OnEdited(object sender, Gtk.EditedArgs args) 
    { 
     Gtk.TreeSelection selection = treeview.Selection; 
     Gtk.TreeIter iter; 
     selection.GetSelected(out iter); 

     treeview.Model.SetValue(iter, 1, args.NewText); // the CellRendererText 
    } 

    static void Main(string[] args) 
    { 
     Gtk.Application.Init(); 

     Gtk.Window window = new Window("TreeView ComboTest"); 
     window.WidthRequest = 200; 
     window.HeightRequest = 150; 

     Gtk.ListStore treeModel = new ListStore(typeof(string), typeof(string)); 
     treeview = new TreeView(treeModel); 

     // Values to be chosen in the ComboBox 
     Gtk.ListStore comboModel = new ListStore(typeof(string)); 
     Gtk.ComboBox comboBox = new ComboBox(comboModel); 
     comboBox.AppendText("<Please select>"); 
     comboBox.AppendText("A"); 
     comboBox.AppendText("B"); 
     comboBox.AppendText("C"); 
     comboBox.Active = 0; 

     Gtk.TreeViewColumn comboCol = new TreeViewColumn(); 
     Gtk.CellRendererCombo comboCell = new CellRendererCombo(); 
     comboCol.Title = "Combo Column"; 
     comboCol.PackStart(comboCell, true); 
     comboCol.AddAttribute(comboCell, "text", 1); 
     comboCell.Editable = true; 
     comboCell.Edited += OnEdited; 
     comboCell.TextColumn = 0; 
     comboCell.Text = comboBox.ActiveText; 
     comboCell.Model = comboModel; 
     comboCell.WidthChars = 20; 

     Gtk.TreeViewColumn valueCol = new TreeViewColumn(); 
     Gtk.CellRendererText valueCell = new CellRendererText(); 
     valueCol.Title = "Value"; 
     valueCol.PackStart(valueCell, true); 
     valueCol.AddAttribute(valueCell, "text", 1); 
     valueCol.Visible = false; 

     treeview.AppendColumn(comboCol); 
     treeview.AppendColumn(valueCol); 

     // Append the values used for the tests 
     treeModel.AppendValues("comboBox1", "<Please select>"); // the string value setted for the first column does not appear. 
     treeModel.AppendValues("comboBox2", "<Please select>"); 
     treeModel.AppendValues("comboBox3", "<Please select>"); 

     window.Add(treeview); 
     window.ShowAll(); 
     Gtk.Application.Run(); 
    } 
}