質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

3398閲覧

TableViewへ文字列の入力と、行の追加・方法を教えて下さい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2018/03/12 14:40

編集2018/03/17 10:46

使用環境

PC:MaxOSX
環境:Visual Studio Community 2016 for mac
言語:c#

やりたい事

イメージ説明

  1. TableViewを用いて、以下のことをしたい
  2. 写真の矢印の部分に文字列を直接入力したい
  3. 行を追加できるようにした(もしくは初めから大数の行を作成しておきたい)
  4. 入力されている文字列を参照したい

現状

イメージ説明
矢印の部分はStoryboardでNSScrollViewでアウトレットしています

また、以下のコードで1枚目の写真のようにTableのヘッダー部分にタイトルを入れることはできました。

c#

1title_column.Title = "名前"; 2address_column.Title = "アドレス";

試したこと

失敗1

c#

1title_column.TableView.AddColumn(new NSTableColumn("123"));

失敗2

c#

1NSCell cell = new NSCell(); 2cell.StringValue = "123"; 3title_column.DataCell = cell; 4 5cell.StringValue = "345"; 6address_column.DataCell = cell;

最後に

TableViewを用いずに、似たような事ができるコンポーネントがあり、それで解決出来るのでも結構です。
何か表を用いて、そこに入力(手入力、またはどこかから参照入力)が可能で、
入力した値が参照をおこないたいと考えています。

何か説明不足や、疑問点があれば仰ってください。すぐに追記いたします。
何卒、お知恵の拝借をよろしくお願い致します。

追記(1)

ご回答いただきましたURLを元に、少しだけ改良致しました。
そのコードと、結果になります。

private void aaa() { title_column.Title = "名前"; address_column.Title = "アドレス"; tableview.DataSource = new TableDataSource(); tableview.Delegate = new TableDelegate(); TextGrid.DocumentView = tableview; }

以下、結果になります。
結果

  • なぜか矢印部分に「Zero」〜「Nine」までの文字か勝手に入力される
  • 選択箇所の後ろ側?だけ、青く色が変わっている
  • 文字の編集などはできない

今後、回答で頂いたURLを読みながら少しずつ改変していきたいと思います。

何卒よろしくお願いいたします。

追記(2)

ご回答いただきましたソースを元に、以下を作成いたしました。

  • 表にキーボードから記入できるようになった
  • 表に行を追加することができるようになった

お陰様で、上記二つの問題は解決いたしました。

残る問題は

  • 表に記入されているデータを参照する
  • あらかじめ表にデータを入力しておく(表に入力したデータをテキストファイルか何かに保存し、それを次回に改めて表示することができる)

の二点となりました。
何卒、解決への糸口をご教授いただければと思います。

現状

解決したソースを掲載させて頂きます。

1.TableViewについてのカスタマイズ(ご回答頂きましたソースのままです)

using System; using System.Collections.Generic; using AppKit; namespace FreeEncodeMailer { public class Product { #region Computed Propoperties public string Title { get; set; } = ""; public string Description { get; set; } = ""; #endregion #region Constructors public Product() { } public Product(string title, string description) { this.Title = title; this.Description = description; } #endregion } /// <summary> /// TableDataSource /// </summary> public class ProductTableDataSource : NSTableViewDataSource { #region Public Variables public List<Product> Products = new List<Product>(); #endregion #region Constructors public ProductTableDataSource() { } #endregion #region Override Methods public override nint GetRowCount(NSTableView tableView) { return Products.Count; } #endregion } /// <summary> /// ProductTableDelegate /// </summary> public class ProductTableDelegate : NSTableViewDelegate { #region Constants private const string CellIdentifier = "ProdCell"; #endregion #region Private Variables private ProductTableDataSource DataSource; #endregion #region Constructors public ProductTableDelegate(ProductTableDataSource datasource) { this.DataSource = datasource; } #endregion #region Override Methods public override NSView GetViewForItem(NSTableView tableView, NSTableColumn tableColumn, nint row) { // This pattern allows you reuse existing views when they are no-longer in use. // If the returned view is null, you instance up a new view // If a non-null view is returned, you modify it enough to reflect the new data NSTextField view = (NSTextField)tableView.MakeView(tableColumn.Title, this); if (view == null) { view = new NSTextField(); view.Identifier = tableColumn.Title; view.BackgroundColor = NSColor.Clear; view.Bordered = false; view.Selectable = false; view.Editable = true; view.EditingEnded += (sender, e) => { // Take action based on type switch (view.Identifier) { case "Product": DataSource.Products[(int)view.Tag].Title = view.StringValue; break; case "Details": DataSource.Products[(int)view.Tag].Description = view.StringValue; break; } }; } // Tag view view.Tag = row; // Setup view based on the column selected switch (tableColumn.Title) { case "Product": view.StringValue = DataSource.Products[(int)row].Title; break; case "Details": view.StringValue = DataSource.Products[(int)row].Description; break; } return view; } public override bool ShouldSelectRow(NSTableView tableView, nint row) { return true; } #endregion } }

2.動作を記述する部分への表記

// 画面がロードされた時 public override void ViewDidLoad() { base.ViewDidLoad(); var DataSource = new ProductTableDataSource(); // Populate the Product Table TableView.DataSource = DataSource; TableView.Delegate = new ProductTableDelegate(DataSource); } public override NSObject RepresentedObject {     get { return base.RepresentedObject; } set { base.RepresentedObject = value; // Update the view, if already loaded. } } // 追加ボタンを押すと入力できる行が追加できるようになりました partial void ClickButton_NewAddress(NSObject sender) { TableView.BeginUpdates(); var DataSource = new ProductTableDataSource(); DataSource = (FreeEncodeMailer.ProductTableDataSource)TableView.DataSource; DataSource.Products.Add(new Product("", "")); TableView.ReloadData(); TableView.EndUpdates(); }

やりたいこと

  • 表に記入されているデータを参照する
  • あらかじめ表にデータを入力しておくことができる
  • ↑(表に入力したデータをテキストファイルか何かに保存し、それを次回に改めて表示することができる)

表のサンプル画像
上記画像のように、選択されている行の値を参照したいと考えています。
また、上記のように表へあらかじめデータを入力しておき、その続きから改めて行の追加を行いたいと考えています。

まず、
2列目(キーがDetailである列(上記、「現状」のコード参照))を取得しようと、以下のようにコードを書きましたが、結果的に空のStringしか取得できませんでした。

partial void ClickButton_GetValue(NSObject sender) { var DataSource = (FreeEncodeMailer.ProductTableDataSource)TableView.DataSource; string address = DataSource.Products[(int)TableView.SelectedRow].Title; }

→他にもいくつか試したのですが。どれもエラーを吐いてしまい、動作しませんでしたので掲載を省きました。

どうすれば、表の値を参照できるのでしょうか?
また、どうすれば「やりたいこと」を実現できるでしょうか?

度々申し訳ございませんが、ご回答をお待ちしております。
何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

空のデータソースをTableViewに追加しておけば事前に空白の行は用意しておけると思います。

データソースの追加は以下のコードが参考になりそうです。
https://github.com/xamarin/mac-samples/blob/master/MacTables/MacTables/ViewController.cs

https://github.com/xamarin/mac-samples/blob/master/NSOutlineViewAndTableView/NSOutlineViewAndTableView/NSTableViewCode/NSTableViewExample.cs

また、このサンプルはセルの文字列も編集できますのでこの動作も参考になるかと思います。
https://github.com/xamarin/mac-samples/blob/master/MacTables/MacTables/ProductTable/ProductTableDelegate.cs

追記(1)

断片的な内容のみを提供してしまい申し訳ありません。以下のドキュメントでTableViewの全容が概ね記載されていますのでこちらも参考になるかと思います。アウトレットの追加なども記載されているのでチェックしてみてください。
https://docs.microsoft.com/ja-jp/xamarin/mac/user-interface/table-view

セルの編集などTableViewの動作をデリゲートで設定します。
https://docs.microsoft.com/ja-jp/xamarin/mac/user-interface/table-view#editing-cells

追記(2)

こちらのコードをベースに
https://docs.microsoft.com/ja-jp/xamarin/mac/user-interface/table-view
ボタンで空白の行を追加するようにしてみました。
https://github.com/ukgraphics/TableViewApp

追記(3)

表に記入されているデータを参照する

以下のようにあらかじめデータソースにデータを追加しておいて

C#

1var DataSource = new ProductTableDataSource(); 2DataSource.Products.Add(new Product("Xamarin.iOS", "Allows you to develop native iOS Applications in C#")); 3DataSource.Products.Add(new Product("Xamarin.Android", "Allows you to develop native Android Applications in C#")); 4DataSource.Products.Add(new Product("Xamarin.Mac", "Allows you to develop Mac native Applications in C#"));

「追加2の現状」で調査いただいたようにボタンクリックで以下のように取得できてました。

C#

1partial void ClickedGetButton(Foundation.NSObject sender) 2{ 3 var DataSource = new ProductTableDataSource(); 4 DataSource = (TableViewApp.ProductTableDataSource)TableView1.DataSource; 5 6 var TitleStr = DataSource.Products[(int)TableView1.SelectedRow].Title; 7 Console.WriteLine(TitleStr); 8}

あらかじめデータソースにデータを追加した場合
行を追加してデータを追加した場合
画像を拝見した限りですとテキストにフォーカスが残っていて編集状態のままのようですので、この状態ですとデータソースにデータとして追加されておらず、空白が返ってくるように思います。

あらかじめ表にデータを入力しておく(表に入力したデータをテキストファイルか何かに保存し、それを次回に改めて表示することができる)

こちらですが、本件が長くなってしまったので新規に別の質問としてアップしてみてはどうでしょうか?

投稿2018/03/14 00:25

編集2018/03/19 08:57
ukgraphics

総合スコア69

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/14 10:35

ご回答を有難うございます。 ご丁寧にURLを貼って頂いたにも関わらず申し訳ございません。 お恥ずかしい話ではありますが、 上記URLを読んでも、どこにどうソースを埋め込めばいいのか。アウトレットはどうなっているのか、など・・・。 かなり初心者の私にはほぼ理解できませんでした。申し訳ございません。 もし、まだおつきあい願えるようでしたら、 *追加したデータソースはどう扱えばいいのか。 *デリゲートの活用法とは? をご教授願えればと思います。 教えて頂きましたソースを元に、少しだけ進展した現状を追記しておきます。 ご一瞥を頂けますと幸いです。 (ほとんど進展できず申し訳ございません) 何卒よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2018/03/19 13:51

ご回答を有難うございます。 そして、ここまでお付き合い頂きまことに有難うございました。 キャプチャ画面までつけて頂き、本当に有難うございます。 しかしなぜかはわからないのですが、データソースにあらかじめデータを入力しておいてもそれが表示されないという事態になってしまっています。 その件も踏まえ、確かに質問内容から少し離れてきてしまったと思いましたので、改めて質問をあげさせて頂きました。 https://teratail.com/questions/118174?modal=q-comp お付き合い頂けるようでしたら、改めてよろしくお願い申し上げます。 本当に有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問